【5.5】指针算法-三指针解决颜色分类
一、题目
给定一个包含红色、白色和蓝色,一共n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数0、1和2分别表示红色、白色和蓝色。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
示例 3:
输入:nums = [0]
输出:[0]
示例 4:
输入:nums = [1]
输出:[1]
提示:
-
n == nums.length
-
1 <= n <= 300
-
nums[i] 为 0、1 或 2
二、解题思路
数组中仅包含三种数字:0、1、2。我们只需将 0 移至前面,将 3 移至后面即可。难度并非很大。下面以示例一为例,来看如下动图。
三、代码实现
#include <iostream>
#include <vector>
using namespace std;
// 交换数组中的两个数字
void swap(vector<int>& nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
// 三指针排序
void sortColors(vector<int>& nums) {
// 0的右边界
int left = 0;
// 2的左边界
int right = nums.size() - 1;
// 指向当前数字
int index = 0;
while (index <= right) {
if (nums[index] == 0) {
// 如果是0,就往前面移
swap(nums, left++, index++);
} else if (nums[index] == 1) {
index++;
} else if (nums[index] == 2) {
// 如果是2就往后面移
swap(nums, right--, index);
}
}
}
int main() {
vector<int> nums = {2, 0, 2, 1, 1, 0};
sortColors(nums);
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}