【刷题日记】75. 颜色分类

简介: 本次刷题日记的第 60 篇,力扣题为:75. 颜色分类,中等

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

本次刷题日记的第 60 篇,力扣题为:75. 颜色分类中等

一、题目描述:

image.png

颜色分类,红橙黄绿青蓝紫,咱们咋区分嘞


二、这道题考察了什么思想?你的思路是什么?

仔细看看这个题,我们如何去做颜色分类:

  • 题目中给出了一个数组,数组中有多个元素,元素的值只有 3 个情况,0,1,2 ,分别代表着红色,白色,蓝色
  • 题目要求我们按照红白蓝的顺序排序数组,且不能使用 golang 提供的 sort 库函数

分析

如何来看这个题目呢,看上去好像很简单的样子,但是为啥是中等题呢,肯定有一定的弯弯绕绕

其实咱们简单的使用是 sort 来排序,从小到大排序一波就搞定了,但是咱们现在不能用了,肯定有别的方式

这里我们知道颜色的种类一共就 3 种,那么我们是不是其实就是对这 3 种颜色排序就可以了,那么我们很容易想到将 0 对应的颜色丢到 左边, 2 对应的颜色丢到 右边,那么剩下的 1 对应的颜色就在中间了,就像这样:

image.png

我们知道需要将上面一排的数组,转换成下面一排的数组,但是要如何做的?

题目要求我们在原地进行转换我们是不是就可以定一个指针,将 2 放到尾巴后面,定义一个指针将 0 放到前面,剩下的 1 就默认在中间的

那么思考一下,我们就可以使用双指针的方式

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

需要注意,遍历数组的时候,咱们定义双指针的时候,是头一个指针,尾巴一个指针,若是 0 就放到头指针上,并向后偏移一位,若是 2 则放到尾巴指针上,且尾巴指针向前移动一位

编码如下:

func sortColors(nums []int) {
    p0, p2 := 0, len(nums)-1
    for i := 0; i <= p2; i++ {
        for ; i <= p2 && nums[i] == 2; p2-- {
            nums[i], nums[p2] = nums[p2], nums[i]
        }
        if nums[i] == 0 {
            nums[i], nums[p0] = nums[p0], nums[i]
            p0++
        }
    }
}

四、总结:

image.png

这种实现方式,时间复杂度是多少呢?

实际的循环是在最外层的大循环上面,因此时间复杂度是 O(n)

空间复杂度度是 O(1) ,因为我们没有引入新的空间消耗

原题地址:75. 颜色分类

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~



相关文章
|
7月前
|
算法
每日一题:LeetCode-75. 颜色分类
每日一题:LeetCode-75. 颜色分类
|
7月前
牛客网刷题总结(各种图形篇)
牛客网刷题总结(各种图形篇)
87 0
|
7月前
|
算法
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
52 3
|
7月前
蓝桥杯真题代码记录(纸张尺寸
蓝桥杯真题代码记录(纸张尺寸
43 0
|
7月前
蓝桥杯真题代码记录(卡片
蓝桥杯真题代码记录(卡片
59 0
|
算法 Cloud Native
【刷题日记】513. 找树左下角的值
本次刷题日记的第 74 篇,力扣题为:513. 找树左下角的值 ,中等
|
Cloud Native
【刷题日记】473. 火柴拼正方形
本次刷题日记的第 52 篇,力扣题为:473. 火柴拼正方形,中等
|
Cloud Native
【刷题日记】1184. 公交站间的距离
好久不刷题,没有锻炼思维,感觉脑袋都要生锈了,刷题感觉还是要从简单题刷题才能慢慢找到感觉
|
索引 Cloud Native
【刷题日记】31. 下一个排列
【刷题日记】31. 下一个排列
|
机器学习/深度学习 Cloud Native
【刷题日记】48. 旋转图像
本次刷题日记的第 66 篇,力扣题为:48. 旋转图像,中等