【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;
}
相关推荐
h_a_o777oah19 分钟前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO922 分钟前
指针的算术运算详解
java·数据结构·算法
Coder-magician27 分钟前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.40 分钟前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o1 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者2 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
-森屿安年-2 小时前
按身高排序
c++·算法
程序员清风2 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
无定义_2 小时前
Codeforces Round 1124 (Div. 2)
算法
(Charon)3 小时前
【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效
c++·面试