题目讲解
75. 颜色分类
这道题的本质就是数组分三块
算法讲解
使用三个指针,i遍历数组,left标记0的最右侧,right标记2的最左侧
如果当前的nums[i] == 0,我们就让nums[++left] 和 nums[i++]位置上的数字做交换,这里的i是可以向前移动的,因为++left位置上的数字一定是1
如果当前的nums[i] == 1,i++即可
如果nums[i] == 2, swap(nums[–right], nums[i])
class Solution {
public:
void sortColors(vector<int>& nums) {
int i = 0, left = -1, right = nums.size();
for(; i < right; )
{
if(nums[i] == 0)
{
swap(nums[++left], nums[i++]);
//此时的i可以先前移动,因为当前的nums[++left]一定是1
}
else if(nums[i] == 1)
{
i++;
}
else
{
swap(nums[--right], nums[i]);
//此时的i不可以移动,因为不知道当前的nums[right]到底是什么数字
}
}
}
};