问题描述 链接到标题
解题思路 链接到标题
这里,我们需要三个指针l
, r
, idx
, l
用来存放0
,r
用来存放2
,idx
用来进行遍历数组。
要注意的是,在遍历数组时:
if nums[idx] == 0
,需要交换nums[idx]
和nums[l]
的值,同时idx++; l++;
if nums[idx] == 1
,idx++
即可if nums[idx] == 2
,需要交换nums[idx]
和nums[l]
的值,但此时只是r--
,不会idx++
,这是因为新的交换后的nums[idx]
的值可能是0、1、2中的任意一个,因此还需要重新判断nums[idx]
- 如果
idx == l
,那么[0, idx]
区间范围内的数都是0,如果idx != l
,那么[0, l - 1]
区间范围内都是0,[l, idx)
区间范围内都是1,因此可以进行idx++;
代码 链接到标题
class Solution {
public:
void sortColors(vector<int> &nums) {
int tmp = 0, index = 0;
int l = 0, r = nums.size() - 1;
while (index <= r) {
if (nums[index] == 0) {
tmp = nums[l];
nums[l++] = 0;
nums[index++] = tmp;
} else if (nums[index] == 2) {
tmp = nums[r];
nums[r--] = 2;
nums[index] = tmp;
} else
index++;
}
}
};