具体思路:
三种思路,单指针,双指针;
1.双指针:
0,1指针:
两个指针指向0元素应该插入的位置和1元素应该插入的位置,调整之后后半部分全是2元素;
但是需要注意的两点:
1.由于1在零后面,所以插入1的时候,不用管,直接p1++即可;
2.由于0在1的前面,插入0后,势必要动后续的1,也就是判定条件为p0<p1情况下,说明0后面已经有排序好的1,所以如果swap 对p0操作,则必定会换一个1到i位置,所以只需要要把换过去的1插入到p1即可;
0,2双指针:
两个指针分别指向0元素应该插入的位置,2元素插入的位置,调整之后中间的自然全是1元素;
但是要注意两点:
1.当换向2位置时,有可能2的位置上已经是2,所以要使用while使得p2移到非2的位置;
2.需要先进行换2判断,后面的可能的0换到前面,方便判断,p0判断和LeetCode 283. 移动零同思想相同;
2.单指针:
每次把同一种元素换到指定位置,但是需要遍历两次;
具体代码:
0,2双指针版本:
class Solution {
public:
void sortColors(vector<int>& nums) {
int p = 0;
int q = nums.size() - 1;
for (int i = 0; i <= q; i++) {
while (i <= q && nums[i] == 2) {
swap(nums[i], nums[q--]);
}
if (nums[i] == 0) {
swap(nums[i], nums[p++]);
}
}
}
};
0,1双指针版本:
class Solution {
public:
void sortColors(vector<int>& nums) {
int p = 0;
int q = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0) {
swap(nums[i], nums[p]);
if (p < q) {
swap(nums[i], nums[q]);
}
p++;
q++;
}
else if (nums[i] == 1) {
swap(nums[i], nums[q++]);
}
}
}
};