python颜色代码有哪些_Python测试篇:LeetCode 75. 颜色分类

上班第一天,有没有感觉些许困意?来道LeetCode测试题提提神吧!今天我们看看来自力扣的75题,关于颜色分类。

题目

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

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

注意:

不能使用代码库中的排序函数来解决这道题。

示例:

进阶:

1、一个直观的解决方案是使用计数排序的两趟扫描算法。

首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。

2、你能想出一个仅使用常数空间的一趟扫描算法吗?

解题思路

思路:

这道题的本质还是一道排序的题,题目中给出提示说可以用计数排序,需要遍历数组两遍,那么先来看这种方法,因为数组中只有三个不同的元素,所以实现起来很容易。

- 首先遍历一遍原数组,分别记录0,1,2的个数

- 然后更新原数组,按个数分别赋上0,1,2

计数排序

我们先统计总共有多少个0、1和2,然后再将这些值放回就可以了,这实际上是计数排序的原理。

先创建长度为 3 的数组 count_array,用来迭代统计0、1、2三个元素的个数;

遍历,根据 count_array 记录的个数,按照 0、1、2 的顺序重写数组。

我们通过分析发现这个算法的时间复杂度是O(n)级别的,而空间复杂度和我们统计的数的个数有关O(3)。并且我们这个解法中扫描了两遍数组,我们有没有只扫描一遍的做法呢?

双指针

题目中还要让只遍历一次数组来求解,那么我们需要用双指针来做,分别从原数组的首尾往中心移动。

- 定义red指针指向开头位置,blue指针指向末尾位置

- 从头开始遍历原数组,如果遇到0,则交换该值和red指针指向的值,并将red指针后移一位。若遇到2,则交换该值和blue指针指向的值,并将blue指针前移一位。若遇到1,则继续遍历。

详细步骤如下:

1、初始化双指针 p1、p2。其中 p1 指向数组头部,p2 指向数组尾部。

2、定义游标 cur 指向数组头部,从左往右遍历数组:

当 nums[cur] == 0 时,交换 cur 对应的元素与 p1 对应的元素,同时将 cur、p1 往后移动一个位置。这里可能存在这样的情况,nums[cur] 等于 0,但 cur 与 p1 重合,这里直接将 cur、p1 往后移动一个位置;

当 nums[cur] == 2 时,交换 cur 对应的元素与 p2 对应的元素,仅将 p2 往前移动一个位置。

若不是上面两种情况(也就是 cur 指向 1 时),仅将 cur 往后移动一个位置。

3、由于遍历从左往右,p2 由右往前移动。所以当 cur 大于 p2 时,停止遍历。

下面是图示:

代码如下:

复杂度分析

时间复杂度:O ( n ) O(n)O(n),n nn 是数组 n u m s numsnums 的长度。

空间复杂度:O ( 1 ) O(1)O(1),仅使用了常数个变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值