两次遍历,第一次将0移动到头部,第二次将1移动到中间:
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size(), cur = 0;
for(int i = 0; i < n; ++i){
if(nums[i] == 0) swap(nums[cur++], nums[i]);
}
for(int i = 0; i < n; ++i){
if(nums[i] == 1) swap(nums[cur++], nums[i]);
}
}
};
如果要求一次遍历:
一次遍历,如果是0,则移动到表头,如果是2,则移动到表尾,不用考虑1。0和2处理完,1自然就是正确的。
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size(), i= 0;
int p0 = 0, p2 = n-1;//0在前面,2在后面
//0往最前面放,2往最后面放,1不管
while(i <= p2){
if(nums[i] == 0) swap(nums[i++], nums[p0++]);
else if(nums[i] == 2) swap(nums[i], nums[p2--]);//注意这儿的i不变,因为交换过来的值可能还需要处理
else ++i;
}
}
};