1. 程式人生 > 其它 >CF427D Match & Catch 題解

CF427D Match & Catch 題解

75. 顏色分類

給定一個包含紅色、白色和藍色、共 n 個元素的陣列 nums原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

我們使用整數 012 分別表示紅色、白色和藍色。

必須在不使用庫的sort函式的情況下解決這個問題。

示例 1:

輸入:nums = [2,0,2,1,1,0]
輸出:[0,0,1,1,2,2]

示例 2:

輸入:nums = [2,0,1]
輸出:[0,1,2]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i]012

進階:

  • 你可以不使用程式碼庫中的排序函式來解決這道題嗎?
  • 你能想出一個僅使用常數空間的一趟掃描演算法嗎?

思路:

​ 常數空間的一趟掃描演算法。

​ 雙指標即可,類似荷蘭國旗問題。

class Solution {
public:
    void sortColors(vector<int>& nums) {
        //雙指標
        //目的是要把0全部放到前半部分,2全部放到後半部分這樣1就會在中間
        int p0=0;
        int p2=nums.size()-1;
        //從前向後遍歷 由於p2是從後向前,那麼i只需要小於等於p2即可
        for(int i=0;i<=p2;i++){
            //如果i遍歷到2,就放到尾部
            while (i <= p2 && nums[i] == 2) {
                swap(nums[i], nums[p2]);
                --p2;
            }
            //如果遍歷到0,就放到首部
            if (nums[i] == 0) {
                swap(nums[i], nums[p0]);
                ++p0;
            }
        }
    }
};