简单粗暴:直接对数组进行sort()排序
思路1:(单指针,两次遍历)
1)对元素为0的交换到前面
2)对元素为1的交换到0后面
代码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:(双指针,一次遍历)
1)对元素为1的交换到前面
2)对元素为0的交换到前面p0,同时因为将1换出,需要将值放入p1中
代码2:
class Solution {
public:
void sortColors(vector<int>& nums) {
int p0 = 0, p1 = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 1) {
swap(nums[i], nums[p1]);
p1++;
}
else if (nums[i] == 0) {
swap(nums[i], nums[p0]);
if (p0 < p1)//将num[i]放入nums[p0],当前num[i]为1,放入nums[p1]
swap(nums[i], nums[p1]);
p0++;
p1++;
}
}
}
};
思路3:
1)对元素为2的交换到后面(注意头元素和尾元素都为2的情况)
2)对元素为0的交换到前面
代码3:
class Solution {
public:
void sortColors(vector<int>& nums) {
int p0 = 0, p2 = nums.size() - 1;
for (int i = 0; i <= p2; i++) {
//处理num[i]与num[p2]都为2的情况
while (i <= p2 && nums[i] == 2) {
swap(nums[i], nums[p2]);
p2--;
}
//将0交换到前面
if (nums[i] == 0) {
swap(nums[i], nums[p0]);
p0++;
}
}
}
};