class Solution {
public:
void sortColors(vector<int>& nums) {
int len=nums.size(),left=0,right=len-1;
while(left<right){
while(nums[left]==0&&left<right) ++left;
while(nums[right]!=0&&left<right) --right;
swap(nums[left],nums[right]);
}
left=0,right=len-1;
while(left<right){
while(nums[left]!=2&&left<right) ++left;
while(nums[right]==2&&left<right) --right;
swap(nums[left],nums[right]);
}
}
};
一次遍历时即把0和1排好,p1>=p0,每次把1交换到p0后,确保[p0,p1)全为1
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size(),p0=0,p1=0;
for(int i=0;i<n;++i){
if(nums[i]==1) {
swap(nums[i],nums[p1]);
++p1;
}else if(nums[i]==0){
swap(nums[i],nums[p0]);
if(p1>p0) {
swap(nums[i],nums[p1]); //当p1>p0时,交换p0则会把p0-p1的1交换出去,则需要补到p1处
}
++p0;
++p1; //p1表示0-p0全是0,p0-p1全是1,0增加到0-p0处,则p0-p1也整段后移一位
}
}
}
};