用两个变量指向red和blue的边界,i遍历数组。
如果nums[i]=0,和nums[red]交换,nums[red]为1(因为i遍历nums[red],是0到前面去了,是2到后面去了),++i。
如果nums[i]=2,和nums[blue]交换,这里nums[blue]可能为0或1,因此交换以后,i不能前进,需要后续判断。
class Solution { public: void sortColors(vector<int>& nums) { int red=0, blue=nums.size()-1; // 0 [0,red) 2 (blue,end()] int i=0; while (i<=blue){ if (nums[i]==0){ swap(nums[i],nums[red++]); ++i; }else if (nums[i]==2){ swap(nums[i],nums[blue--]); }else ++i; } } };
另一种写法:
class Solution { public: void sortColors(vector<int>& A) { int second=A.size()-1, zero=0; for (int i=0; i<=second; ++i) { while (A[i]==2 && i<second) swap(A[i], A[second--]); while (A[i]==0 && i>zero) swap(A[i], A[zero++]); } } };