题目描述:

方法1:单指针,两次循环,第一次把0移到前面,第二次把1移到前面

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int n = nums.size();
        int pos = 0;
        for(int i=0;i<n;i++){
            if(nums[i] == 0) swap(nums[i],nums[pos++]);
        }
        for(int i=0;i<n;i++){
            if(nums[i] == 1) swap(nums[i],nums[pos++]);
        }
    }
};

方法2:双指针p0指向插的0的位置,p1指向插的1的位置

i遍历数组:

如果nums[i]是0,把nums[i]放到p0位置,如果p0原本的是1,再把nums[i]放p1位置,然后p0,p1都加1

如果nums[i]是1,把nums[i]放到p1位置,然后p1加1

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int n=nums.size();
        int p0 = 0;
        int p1 = 0;
        for(int i=0;i<n;i++){
            if(nums[i] == 0){
                swap(nums[p0],nums[i]);
                if(nums[i] == 1) swap(nums[p1],nums[i]);
                p0++;
                p1++;
            }
            else if(nums[i] == 1) swap(nums[p1++],nums[i]);
        }
    }
};