44. 颜色分类
题目链接
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例 1: 输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
示例 2: 输入:nums = [2,0,1] 输出:[0,1,2]
即对这三类元素进行排序。
解法:三指针
i指针遍历数组left指针标记 0 区域最右侧right标记 2 区域的最左侧
此时数组被划分为四个部分:
[0, left]:全是 0[left+1, i-1]:全都是 1[i, right-1]:待扫描的元素[right, n-1]:全都是 2
逻辑如下:
- 如果
nums[i] == 0:将当前位置与nums[++left]交换,然后i++。这样先将left右移再交换,确保left指向 0 区域的边界。 - 如果
nums[i] == 1:直接i++,因为中间区域存放的是 1。 - 如果
nums[i] == 2:将当前位置与nums[--right]交换。注意此时不移动i,因为从右侧交换过来的元素尚未扫描。
当 i 和 right 相遇后,扫描完成。
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int left = -1, right = n, i = 0;
while (i < right) {
if (nums[i] == 0) swap(nums[++left], nums[i++]);
else if (nums[i] == ) i++;
(nums[--right], nums[i]);
}
}
};


