【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

  • numsi 为 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;
}
相关推荐
水上冰石8 小时前
comfui的sd1.5模型,有多少采样算法,详解每一个采样算法
人工智能·算法
磊 子8 小时前
STL之deque和list以及两者与vector的对比
开发语言·c++·list
郝学胜_神的一滴9 小时前
CMake 012:Linux 下动态库与可执行程序的单文件构建
c++·cmake
黎阳之光9 小时前
视频孪生+空天地水工融合,黎阳之光构建智慧水利监测新范式
大数据·人工智能·物联网·算法·安全
小poop9 小时前
操作符详解:从入门到精通
c++
山上三树9 小时前
C/C++ 高频报错速查表(开发通用版)
c语言·开发语言·c++
cheems95279 小时前
[算法手记] 贪心 爬楼梯问题
算法·贪心算法
Tian_Hang9 小时前
Factory Method | 工厂方法
开发语言·c++
KaMeidebaby9 小时前
卡梅德生物技术快报|酵母双杂交 cDNA 文库构建与蛋白互作筛选流程
服务器·前端·数据库·人工智能·算法
sheeta19989 小时前
LeetCode 每日一题笔记 日期:2026.05.27 题目:3121. 统计特殊字母的数量 II
笔记·算法·leetcode