解题思路-LeetCode第75题:颜色分类
题目描述:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
示例 3:
输入:nums = [0]
输出:[0]
示例 4:
输入:nums = [1]
输出:[1]
解题思路:
定义两个指针P0,P1(或者说是数组索引/下标),用于指示当前已经排序的一系列0或1写到的位置。P1始终>=P0
再定义一个变量,指向当前考察的位置。当前考察的数字为2,则什么都不做,继续向后推进;当前数字为0时,目标是把这个0写入已经排好序的一系列连续0的末尾。这个时候要考虑在此之前是否已经写入过1。
(1)没写过时,P1 == P0,此时只要交换P0和当前考察位置的元素即可;
(2)之前写过1时,也是先交换(1)中的元素,此时0已经写到正确位置,但有一个1被换到后面去了,此时要再进行一次交换,把换到后面的1换到P1指向的位置。最终的结果等价于:往一串连续的0和1里面插了一个0,插入的位置后面的1往后顺延一个位置,并且最后一个1会挤掉后面一个元素,把它挤到当前考察的位置,且这个元素必定为2
代码如下:
提交后,通过。