CF427D Match & Catch 題解
阿新 • • 發佈:2022-05-18
75. 顏色分類
給定一個包含紅色、白色和藍色、共 n
個元素的陣列 nums
,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
我們使用整數 0
、 1
和 2
分別表示紅色、白色和藍色。
必須在不使用庫的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]
為0
、1
或2
進階:
- 你可以不使用程式碼庫中的排序函式來解決這道題嗎?
- 你能想出一個僅使用常數空間的一趟掃描演算法嗎?
思路:
常數空間的一趟掃描演算法。
雙指標即可,類似荷蘭國旗問題。
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; } } } };