75.顏色分類

清澈的澈發表於2024-03-25

image-20240325164500994

自己的思路:

思路和移動零一樣,只是進行了兩次移動,第一次為”移動2“,第二次為倒著的”移動0“(將0全部移動到最前面),中間自然會剩下1

自己的程式碼

class Solution {
    public static void sortColors(int[] nums) {
        // ”移動2“
        int i = 0;
        int j = 0;
        while(j < nums.length){
            if(nums[j] != 2){
                nums[i] = nums[j];
                i ++;
            }
            j ++;
        }
        for(;i < nums.length; i ++)
            nums[i] = 2;

        // 倒著移動零
        i = nums.length - 1;
        j = nums.length - 1;
        while(j >= 0){
            if(nums[j] != 0){
                nums[i] = nums[j];
                i --;
            }
            j --;
        }
        for(;i >= 0; i --)
            nums[i] = 0;
    }
}

image-20240325174736507

吳師兄的:三指標

左指標,右指標,中間指標,中間指標遍歷,遇到0則和左指標交換,遇到2則和右指標交換(這裡要觀察一輪,index指標不能馬上++)

class Solution {
    public void sortColors(int[] nums) {
        
        // left  指向陣列的開始的位置,它指向的位置左側都是 0
        int left = 0;

        // right  指向陣列的結束的位置,它指向的位置右側都是 2
        int right = nums.length - 1;

        // index 指向陣列的開始位置
        int index = 0;

        // index 向後移動,當它越過 right 時跳出迴圈,不需要再判斷了
        // 因為此時說明 index 右側的都已經是 2
        while( index <= right ){

            // 獲取當前的元素值
            int cur = nums[index];
            
            // 如果 index 位置上的元素值為 0
            if(cur == 0){
              // 說明是紅色,要放在最前面去
              // 最前面的那個元素被 left 指著,所以讓 index 指向的元素和 left 指向位置上的元素進行交換
              swap(nums,left,index);

              // index 可以向後移動
              index++;

              // left 可以向後移動,它的左側區域都是 0
              left++;

              // 如果 index 位置上的元素值為 1
            }else if(cur == 1){
                // 說明是白色,就應該放在中間,不用管它,繼續移動 index
                index++;

                // 如果 index 位置上的元素值為 2
            }else if(cur == 2){

                // 說明是藍色,要放在最後面
                // 所以讓 index 指向的元素和 right 指向位置上的元素進行交換
                swap(nums,right,index);

                // 由於原先 right 指向的元素可能為 0、1、2 這三種的任何一種
                // 交換到了 index 後,還需要繼續觀察一輪,所以 index 先不移動
                right--;
            }
        }

    }

    // 透過中間變數,交換兩個元素的值
    // nums[i] 的值變為了 nums[j] 的值 
    // nums[j] 的值變為了 nums[i] 的值 
    private void swap(int[] nums, int i ,int j){
        // 使用臨時變數 temp,儲存 nums[i] 的值
        int temp = nums[i];
        
        // nums[i] 的值修改為 nums[j] 的值
        nums[i] = nums[j];

        // nums[i] 的值修改為 temp 的值
        nums[j] = temp;
    }
}

官方題解:

單指標:其實也是雙指標

class Solution {
    public static void sortColors(int[] nums) {
        int i = 0;
        int head = -1;
        int max = nums.length;
        // 移動零
        while(i < max){
            if(nums[i] == 0){
                head ++;
                swap(nums, i, head);

            }
            i ++;
        }
        // 移動1
        i = head + 1;
        while(i < max){
            if(nums[i] == 1){
                swap(nums, i , head+1);
                head ++;
            }
            i ++;
        }
    }

    public static void swap(int[] arrays, int a, int b){
        int temp = arrays[a];
        arrays[a] = arrays[b];
        arrays[b] = temp;
    }
}

相關文章