题山采玉:(三指针)颜色分类

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!

我的博客:yuanManGan

我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记  闲言碎语小记坊 题山采玉

题目来源:力扣  颜色分类

题目理解:

数组里面只有0,1,2三种元素,以0,1,2的顺序排好数组,要求原地进行排序,并且不能使用sort等函数进行排序。

思路讲解:

sort:

不听不听我就要排序。

三指针:

这是一道板块问题,类似于荷兰国旗问题。我们之前学习过移动零,这里给个链接回顾一下。我们解决移动零这一道同样的板块问题时,我们使用的是双指针,将数组分为三块,一块是零,一块是带扫描区域,一块是1的区域。这道题我们同样的思路

定义一个i来遍历数组

定义left表示0区间最后一个元素

定义right表示2区间第一个元素

就可以得到 [ 0, left ]  [ lefft + 1, i - 1 ]  [ i , right - 1]    [right , n-1]

                          0                  1            待扫描区域             2                   

然后我们来分类讨论一下:

就以题目实例为里模拟实现一下。

当 i 指向2时,我们将i与right-1交换位置,然后将right--就解决了注意这里i不能++,因为交换之后的right- 1依然是带扫描区域。

看效果:

当i指向0:我们得将i与left+1交换位置,left++因为i的左边已经被遍历了,所以i要++。

看效果:

当后面相同的情况就不讲了:

当i指向1时我们只需要进行i++就解决了

 

可见结束条件就是i == right 的时候

代码实现

注意细节哦 

时间复杂度O(n);

空间复杂度O(1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值