思路1:
- 将0都交换到前面去
- 将1都交换到中间去
代码1:
class Solution {
public:
void sortColors(vector<int>& nums) {
int p = 0;
//将0都交换到前面去
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0) {
swap(nums[i], nums[p]);
p++;
}
}
//将1都交换到中间去
for (int i = p; i < nums.size(); i++) {
if (nums[i] == 1) {
swap(nums[i], nums[p]);
p++;
}
}
}
};
思路2:
- 把所有2换到后面,注意前后都是2的情况
- 把所有0换到前面
代码2:
class Solution {
public:
void sortColors(vector<int>& nums) {
int p0 = 0, p2 = nums.size() - 1;
for (int i = 0; i <= p2; i++) {
//将2交换到后面 为啥是while而不是if?
while (i <= p2 && nums[i] == 2) {
swap(nums[i], nums[p2]);
p2--;
}
//将0交换到前面
if (nums[i] == 0) {
swap(nums[i], nums[p0]);
p0++;
}
}
}
};
为什么是设置循环而不是if?
为了防止前后都是2,那就是换了个寂寞。
考虑以下情况:
2 1 2
2 1 2//循环第一次
1 2 2//循环第二次
本文介绍了两种不同的双指针排序算法,用于将包含0、1、2的整数数组按照0在前,1在中,2在后的顺序进行排序。第一种方法分别将0和1交换到正确位置,而第二种方法通过同时处理2和0,避免了0被错误交换的情况。这两种策略都避免了不必要的交换操作,提高了算法效率。
446

被折叠的 条评论
为什么被折叠?



