此题两次遍历很容易做,并且能满足O(1)空间,只要存每个数个数,然后填充即可。
此题比较难的是一次遍历的解法,
这里我们使用双指针来做。由于我们希望前面都是0,后面都是2,所以用两个指针来维护头和尾,放置0和2.
遍历每个元素,如果是2,就放到后面,但是这里可能会遇到2和2交换的情况,所以我们用while来持续放置。如果是0,那么我们直接交换即可。0不用循环,因为2不到后面不行,但是0肯定要遍历到才会交换。
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int p0 = 0, p2 = n-1;
for(int i=0;i<=p2;i++)
{
while(i<p2 && nums[i] == 2)
{
swap(nums[i], nums[p2]);
p2--;
}
if(nums[i] == 0)
{
swap(nums[p0], nums[i]);
p0++;
}
}
}
};