【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 移至后面即可。难度并非很大。下面以示例一为例,来看如下动图。

三、代码实现

cpp 复制代码
#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;
}
相关推荐
青少儿编程课堂12 分钟前
2026青少儿信息素养大赛备赛指南!Python/Scratch/C++备考要点
开发语言·c++·python
旖-旎23 分钟前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰25 分钟前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx30 分钟前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先
AIFarmer1 小时前
【无标题】
开发语言·c++·算法
John_ToDebug1 小时前
WebHostView 与 TabStrip 交互机制深度解析
c++·chrome·windows
AGV算法笔记1 小时前
CVPR 2025 最新感知算法解读:GaussianLSS 如何用 Gaussian Splatting 重构 BEV 表示?
算法·重构·自动驾驶·3d视觉·感知算法·多视角视觉
勤劳的进取家2 小时前
数据链路层基础
网络·学习·算法
南境十里·墨染春水2 小时前
C++笔记 STL——set
开发语言·c++·笔记
dgaf2 小时前
DX12 快速教程(17) —— 立体图标与合并渲染
c语言·c++·3d·图形渲染·d3d12