颜色分类

举报
Linux猿 发表于 2022/02/20 21:59:46 2022/02/20
【摘要】 CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


一、题目描述

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库的sort函数的情况下解决这个问题。

提示:

n == nums.length

1 <= n <= 300

nums[i] 为 0、1 或 2

二、测试样例

输入:nums = [2,0,2,1,1,0]

输出:[0,0,1,1,2,2]

说明:经过重排后,按照 0, 1, 2的顺序排列。

三、算法思路

本题是将红白蓝三种颜色分类,很经典的一道题目。

如果是两种颜色分类,可以直接使用两个指针。

本题需要区分三种颜色,三种三色使用整数 0 ,1,2 来区分。

使用三个指针 p1、p2 和 p3,其中,p1 从头开始,p2 从尾开始, p3 从头开始。p1 用于区分 0 和 其它颜色,p3 用于区分 2 和其它颜色,p2 用于将 0 和 2 放到开头和结尾。

四、代码实现

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int p1 = 0, p2 = 0, p3 = nums.size() - 1;
        while(p1 < p3) {
            while(p1 < p3 && nums[p1] == 0) p1++;
            while(p1 < p3 && nums[p3] == 2) p3--;
            if(p2 < p1) {
                p2 = p1;
            }
            if(nums[p1] == 1 && nums[p3] == 1) {
                while(p2 < p3 && nums[p2] == 1) p2++;
                if(p2 >= p3) break;
                nums[p2] == 0 ? swap(nums[p1++], nums[p2++]) : swap(nums[p3--], nums[p2++]);
            } else {
                swap(nums[p1], nums[p3]);
            }
        }
    }
};

int main()
{
    Solution obj;
    //int a[] = {2, 0, 2, 1, 1, 0};
    //vector<int>nums(a, a+6);
    //int b[] = {0, 0};
    //vector<int>nums(b, b+2);
    int c[10] = {1,2,2,2,2,0,0,0,1,1};
    vector<int>nums(c , c+10);
    obj.sortColors(nums);
    for(int i = 0; i < (int)nums.size(); ++i) {
        cout<<nums[i]<<endl;
    }
    return 0;
}

 

五、复杂度分析

5.1 时间复杂度

时间复杂度:O(n),其中,n 为数组的长度,使用三个指针,只遍历了一次数组,所以时间复杂度为O(n)。

5.2 空间复杂度

空间复杂度:O(1),在上述算法中,仅使用到了三个指针,所以空间复杂度为 O(1)。

六、总结

本题是分类两种颜色的加强版,如果理解了两种颜色的解决方法,解决本题应该不难。


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。