【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;
}
相关推荐
无敌岩雀9 分钟前
C++设计模式结构型模式———桥接模式
c++·设计模式·桥接模式
朱玥玥要每天学习21 分钟前
交换排序与快速排序
数据结构·算法·排序算法
非概念24 分钟前
常见的排序算法(一)
数据结构·算法·排序算法
Ning_.27 分钟前
力扣第39题:组合总和(C语言解法)
c语言·算法·leetcode
lqqjuly34 分钟前
深度学习基础知识-Batch Normalization(BN)超详细解析
人工智能·深度学习·算法
麻由由哒哟1 小时前
CSP-J2023T4 旅游巴士(同余最短路)
c++·算法
trueEve1 小时前
SQL,力扣题目262,行程和用户
算法·leetcode·职场和发展
点点滴滴的记录1 小时前
56. 数组中只出现一次的数字
java·数据结构·算法
Fms_Sa1 小时前
数据结构第七章-顺序查找(顺序存储结构+链式存储结构)
数据结构·算法
冉佳驹1 小时前
数据结构 ——— 计算链式二叉树叶子节点的个数以及计算链式二叉树的高度
c语言·数据结构·算法·二叉树·链式二叉树