嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!
我的博客:yuanManGan
题目来源:力扣 颜色分类
题目理解:
数组里面只有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);