本文首發於公衆號「五分鐘學算法」,是圖解 LeetCode 系列文章之一。git
我的網站:www.cxyxiaowu.comgithub
題目來源於 LeetCode 上第 75 號問題:顏色分類。題目難度爲 Medium,目前經過率爲 51.8% 。算法
給定一個包含紅色、白色和藍色,一共 n 個元素的數組,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。數組
此題中,咱們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。bash
注意: 不能使用代碼庫中的排序函數來解決這道題。函數
示例:動畫
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
複製代碼
進階:網站
結合三路快排 partition 思路的應用。spa
設定兩個索引,一個從左往右滑動zero
,一個從右往左滑動two
。code
nums
,當nums[i]
的值爲1時,i++
;nums[i]
的值爲2時,two
的值先減1,然後交換nums[i]
與nums[two]
,此時在觀察nums[i]
的值;nums[i]
的值爲0時,zero++
,然後交換nums[i]
與nums[zero]
,i++
;當 i = two
時,結束循環。// 三路快速排序的思想
// 對整個數組只遍歷了一遍
// 時間複雜度: O(n)
// 空間複雜度: O(1)
class Solution {
public:
void sortColors(vector<int> &nums) {
int zero = -1; // [0...zero] == 0
int two = nums.size(); // [two...n-1] == 2
for(int i = 0 ; i < two ; ){
if(nums[i] == 1){
i ++;
}else if (nums[i] == 2){
two--;
swap( nums[i] , nums[two]);
}else{ // nums[i] == 0
zero++;
swap(nums[zero] , nums[i]);
i++;
}
}
}
};
複製代碼