两次遍历,第一次将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;
}
}
};
本文提供了一种解决LeetCode上颜色分类问题的算法。通过两次遍历将0和1分别移动到数组的头部和中部,或者一次遍历将0移动到头部,2移动到尾部,最终实现原地排序,无需额外空间。



被折叠的 条评论
为什么被折叠?



