地址 https://leetcode-cn.com/problems/sort-colors/
給定一個包含紅色、白色和藍色,一共 n 個元素的數組,原地對它們進行排序,
使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
示例 1:
輸入:nums = [2,0,2,1,1,0]
輸出:[0,0,1,1,2,2]
示例 2:
輸入:nums = [2,0,1]
輸出:[0,1,2]
示例 3:
輸入:nums = [0]
輸出:[0]
示例 4:
輸入:nums = [1]
輸出:[1]
解答
首先樸素想法是排序 就能得到題目要求,但是複雜度是O(nlogn);
class Solution {
public:
void sortColors(vector<int>& nums) {
sort(nums.begin(),nums.end());
return ;
}
};
可以想到 整個數組有兩個邊界 x1 和 x2
x1左邊全部是0 x1右邊全部是1
x2左邊全是1 x2右邊全是2
掃描兩次即可,每次都是從頭到尾掃描,時間複雜度也是O(n)
class Solution {
public:
void sortColors(vector<int>& nums) {
int first = 0; int find =0;
//首先保證0 全部歸位
for(find =0;find<nums.size();find++){
if(nums[find]==0){
swap(nums[first],nums[find]);
first++;
}
}
//0全部歸位後, 查找1
for(find = first;find<nums.size();find++){
if(nums[find]==1){
swap(nums[first],nums[find]);
first++;
}
}
return ;
}
};