欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > LeetCode -Hot100 -75. 颜色分类

LeetCode -Hot100 -75. 颜色分类

2025/2/24 7:49:43 来源:https://blog.csdn.net/weixin_45857030/article/details/144812466  浏览:    关键词:LeetCode -Hot100 -75. 颜色分类

前言

本专栏主要通过“LeetCode 热题100”,来捡起自己本科阶段的算法知识与技巧。语言主要使用c++/java。如果同样正在练习LeetCode 热题100的朋友欢迎关注或订阅本专栏。有疑问欢迎留言交流~

题目描述

题目链接

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:

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

思路

这个题目被leetcode归类为技巧专栏里面。**题目是一个典型的“假排序”问题。**题目的背景虽然是说的排序,但是其实压根不用真的去排序,只需要记录每个元素出现的个数即可。

记得本科做算法训练也出现过这类题目。要排序的数组很大,即便是O(nlog(n))也无法满足要求。但是它给的数字本身值的范围很小,技巧和本题一摸一样。

本题代码如下:

class Solution {
public:void sortColors(vector<int>& nums) {//经典的“假排序”(只需要记录出现的次数)unordered_map<int,int> numCount;for(int num:nums){numCount[num]++;}//放0int curi = 0;while(numCount[0]--){nums[curi++] = 0;}//放1while(numCount[1]--){nums[curi++] = 1;}//放2while(numCount[2]--){nums[curi++] = 2;}}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词