在這裏,我們將使用0,1和2的整數分別表示紅色,白色和藍色。將所有的0,1,2元素進行排序

給定一個n個對象顏色爲紅色,白色或藍色的數組,對其進行排序,使相同顏色的對象相鄰,顏色爲紅色,白色和藍色。

在這裏,我們將使用0,1和2的整數分別表示紅色,白色和藍色。

優化前的思路及代碼:

class Solution {
    public void sortColors(int[] nums) {
        //時間複雜度:O(n)空間複雜度:O(1)
        int[] count = {0,0,0};//存放0,1,2三個元素的出現頻率
        
        for(int num : nums){
            if(num >= 0 && num <= 2)//確保數組中元素的值都爲0,1,2
                count[num]++;
            else
                System.out.println("您輸入的數組元素有誤");
        }
        
        int index = 0;//原來數組的下標,重新排序
        int j = 0;//數組中的元素
        while(j < count.length){
            
           for(int i = 0;i<count[j];i++){
                nums[index++] = j;
            } 
            j++;
        }
    
    }
}
參考三路快排後的思路及代碼:

class Solution {
    public void sortColors(int[] nums) {
        //時間複雜度:O(n)空間複雜度:O(1)[只遍歷一遍完成題目的要求]
        int zero = -1;          //nums[0...zero] == 0;
        int two = nums.length;  //nums[two,n-1] == 2;
        
        for(int i = 0;i < two;){
            if(nums[i]==1) {
                i++;
            }else if(nums[i] == 2) {
                //two--;
                int temp = nums[i];
                nums[i] = nums[--two];
                nums[two] = temp;
            }else {
                if(nums[i] == 0){
                    //zero++;
                    int tmp = nums[++zero];
                    nums[zero] = nums[i];
                    nums[i] = tmp;
                    i++;
                    
                }else{
                    System.out.println("您輸入的數組的數據有誤!!!");
                }
            }
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章