Leetcode笔记目录
一、题目描述
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例1:
- 输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
二、解题过程
1.思想
可以使用题目给出的方法,先扫描一遍数组统计频率然后重写数组,速度也很可观,此处采用三指针:
- 注意指针初始值的设定,及其增减的位置;
2.代码
void sortColors(vector<int> &nums) {
int size = nums.size();
if (size < 2) { //错误1 边界判断
return;
}
// all in [0, zero) = 0
// all in [zero, i) = 1
// all in [two, len - 1] = 2
int zero = 0;
int two = size;
int i = 0;
while (i < two) {
if (nums[i] == 0) {
swap(nums[zero], nums[i]);
zero++;
i++;
} else if (nums[i] == 1) {
i++;
} else {
two--;
swap(nums[i], nums[two]);
}
}
}
- 错误
- 边界判断。
三、总结
注意这种三指针的思想。