2404 字
约 8 分钟
10
075.颜色分类
无标签

075.颜色分类

作者:沉默王二
发布时间:2023-02-27T21:27:10.875+0800


本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

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

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

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

难度

中等

示例

示例 1:

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

示例 2:

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

分析

题目的最后一句话,很容易误导我们走上排序算法的“不归路”,从而想到快速排序,但是快速排序算法真的是最优解吗?

并不是!

因为即便是快速排序,最快也只能够做到,但是有一种更快的排序算法——桶排!

我们可以利用一个int[] bucket来记录每个数字出现的次数,例如:如果5出现了3次,那么bucket[5]就等于3。

基于这样的想法,我们只需要遍历一次nums[],就能得出每个数字到底有几个,然后再遍历bucket[]将其中的数字依次按照数量取出来,不就能够在的时间内解决问题了吗?

是的,这样看起来,桶排是不是非常优秀?比快速排序还优秀的时间复杂度,是不是就可以无脑替换掉快排呢?

不行!

仔细观察一下,影响桶排的最重要因素,是nums[]的值域范围!

假设我们有一个数21474843647,那是不是意味着bucket[]的大小就要是……

是的,桶排的时间复杂度不仅仅由nums[]的长度决定,还由nums[]的值域范围决定。

然而这道题目,nums[i]的可能取值只有0,1,2,所以我们可以放心大胆地使用桶排。

class Solution {

        int[] cnt = new int[3];        for (int num : nums) cnt[num]++;        for(int i = 0;i < cnt[0];i++)            nums[i] = 0;        for(int i = cnt[0];i < cnt[0] + cnt[1];i++)            nums[i] = 1;        for(int i = cnt[0] + cnt[1];i < cnt[0] + cnt[1] + cnt[2];i++)            nums[i] = 2;    }}

总结

各种排序均有各自的优势,我们需要在特定的场景选择特定的排序算法,发挥其最大的作用。

力扣链接:https://leetcode.cn/problems/sort-colors/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1800 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

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

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

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

难度

中等

示例

示例 1:

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

示例 2:

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

分析

题目的最后一句话,很容易误导我们走上排序算法的“不归路”,从而想到快速排序,但是快速排序算法真的是最优解吗?

并不是!

因为即便是快速排序,最快也只能够做到,但是有一种更快的排序算法——桶排!

我们可以利用一个int[] bucket来记录每个数字出现的次数,例如:如果5出现了3次,那么bucket[5]就等于3。

基于这样的想法,我们只需要遍历一次nums[],就能得出每个数字到底有几个,然后再遍历bucket[]将其中的数字依次按照数量取出来,不就能够在的时间内解决问题了吗?

是的,这样看起来,桶排是不是非常优秀?比快速排序还优秀的时间复杂度,是不是就可以无脑替换掉快排呢?

不行!

仔细观察一下,影响桶排的最重要因素,是nums[]的值域范围!

假设我们有一个数21474843647,那是不是意味着bucket[]的大小就要是……

是的,桶排的时间复杂度不仅仅由nums[]的长度决定,还由nums[]的值域范围决定。

然而这道题目,nums[i]的可能取值只有0,1,2,所以我们可以放心大胆地使用桶排。

class Solution {

        int[] cnt = new int[3];        for (int num : nums) cnt[num]++;        for(int i = 0;i < cnt[0];i++)            nums[i] = 0;        for(int i = cnt[0];i < cnt[0] + cnt[1];i++)            nums[i] = 1;        for(int i = cnt[0] + cnt[1];i < cnt[0] + cnt[1] + cnt[2];i++)            nums[i] = 2;    }}

总结

各种排序均有各自的优势,我们需要在特定的场景选择特定的排序算法,发挥其最大的作用。

力扣链接:https://leetcode.cn/problems/sort-colors/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1800 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

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

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

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

难度

中等

示例

示例 1:

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

示例 2:

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

分析

题目的最后一句话,很容易误导我们走上排序算法的“不归路”,从而想到快速排序,但是快速排序算法真的是最优解吗?

并不是!

因为即便是快速排序,最快也只能够做到,但是有一种更快的排序算法——桶排!

我们可以利用一个int[] bucket来记录每个数字出现的次数,例如:如果5出现了3次,那么bucket[5]就等于3。

基于这样的想法,我们只需要遍历一次nums[],就能得出每个数字到底有几个,然后再遍历bucket[]将其中的数字依次按照数量取出来,不就能够在的时间内解决问题了吗?

是的,这样看起来,桶排是不是非常优秀?比快速排序还优秀的时间复杂度,是不是就可以无脑替换掉快排呢?

不行!

仔细观察一下,影响桶排的最重要因素,是nums[]的值域范围!

假设我们有一个数21474843647,那是不是意味着bucket[]的大小就要是……

是的,桶排的时间复杂度不仅仅由nums[]的长度决定,还由nums[]的值域范围决定。

然而这道题目,nums[i]的可能取值只有0,1,2,所以我们可以放心大胆地使用桶排。

class Solution {

        int[] cnt = new int[3];        for (int num : nums) cnt[num]++;        for(int i = 0;i < cnt[0];i++)            nums[i] = 0;        for(int i = cnt[0];i < cnt[0] + cnt[1];i++)            nums[i] = 1;        for(int i = cnt[0] + cnt[1];i < cnt[0] + cnt[1] + cnt[2];i++)            nums[i] = 2;    }}

总结

各种排序均有各自的优势,我们需要在特定的场景选择特定的排序算法,发挥其最大的作用。

力扣链接:https://leetcode.cn/problems/sort-colors/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1800 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

            知识星球
            
    
    
        
        扫码加入星球
        查看更多优质内容
    
    https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412
075.颜色分类
https://clxhxhhr.top/posts/2529/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。