1. 程式人生 > 實用技巧 >LeetCode 75 顏色分類

LeetCode 75 顏色分類

LeetCode 75 顏色分類

問題描述:
給定一個包含紅色、白色和藍色,一共n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、1 和 2 分別表示紅色、白色和藍色。
注意:

  • 不能使用程式碼庫中的排序函式來解決這道題。

三指標

  • lastRed指向左側連續的0中最後一個0的位置
  • firstBlue指向右側連續的2中第一個2的位置
  • curr從lastRed+1開始遍歷每個元素,並將0,2新增到左右兩側

執行用時:0 ms, 在所有 Java 提交中擊敗了100.00%的使用者
記憶體消耗:37.4 MB, 在所有 Java 提交中擊敗了46.38%的使用者

class Solution {
    public void sortColors(int[] nums) {
        if(nums==null || nums.length==0) {
            return;
        }
        //三指標
        int lastRed = -1, firstBlue = nums.length;
        while(lastRed<firstBlue-1 && nums[lastRed+1]==0) {
            lastRed++;
        }
        while(firstBlue>lastRed+1 && nums[firstBlue-1]==2) {
            firstBlue--;
        }
        int curr = lastRed+1;
        while(lastRed<firstBlue && curr<firstBlue) {
            if(nums[curr]==0) {
                //交換lastRed+1與curr
                swap(nums, lastRed+1, curr);
                lastRed++;
            }
            if(nums[curr]==2) {
                //交換firstBlue-1與curr
                swap(nums, firstBlue-1, curr);
                firstBlue--;
            }
            if(curr==lastRed || curr==firstBlue || nums[curr]==1) {
                curr++;
            }
        }
        return;
    }

    public void swap(int[] nums, int idx1, int idx2) {
        if(nums==null || nums.length==0 || idx1<0 || idx1>=nums.length || idx2<0 || idx2>=nums.length) {
            return;
        }
        //交換idx1、idx2
        int tmp = nums[idx1];
        nums[idx1] = nums[idx2];
        nums[idx2] = tmp;
        return;
    }
}