颜色分类(荷兰国旗问题)
题目描述
给定一个包含 0、1 和 2 的数组,代表红、白、蓝三种颜色。要求在不使用库函数排序的情况下,原地将数组按颜色顺序排列。
核心思路
这道题本质上是三路划分问题。我们可以利用三个指针将数组划分为四个区域:[0, left] 为 0,[left+1, i-1] 为 1,[i, right-1] 为未处理区,[right, n-1] 为 2。
初始化时,left = -1,right = n,i = 0。遍历过程中根据 nums[i] 的值进行不同操作:
- 遇到
0:交换到左侧区域。执行swap(nums[++left], nums[i++])。注意这里i也要自增,因为交换过来的元素只可能是1(来自left+1位置),无需再次判断。 - 遇到
1:属于中间区域,直接i++继续向后扫描。 - 遇到
2:交换到右侧区域。执行swap(nums[--right], nums[i])。注意此时i不能自增,因为从右侧换过来的元素尚未检查,需要留在当前位置重新判断。
当 i 遍历到 right 时,所有元素均已归位。

参考实现
class Solution {
public:
void sortColors(vector<int>& nums) {
int left = -1, right = nums.size();
int i = 0;
while (i < right) {
if (nums[i] == 0) swap(nums[++left], nums[i++]);
else if (nums[i] == ) i++;
(nums[--right], nums[i]);
}
}
};


