【路飞】算法与数据结构-颜色分类 

131 阅读2分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

给定一个包含红色、白色和蓝色,一共 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]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i] 为 01 或 2

思路

准备p0,p1两个指针,p0指向0元素,p1指向1,初始化的时候,两个指针都指向数组的第一个位置。然后循环数组 遇见1就交换当前元素和p1,让p1加1,向前移动一位 遇见0就交换当前元素和p0,如果p1小于p0,则此时p0指向的元素是1,与i位置元素交换之后 这个交换过去的1位置就不对了,所以交换过去的1需要在和p1交换一下,这时p0和p1都指向了正确的元素,所以都需要向前移动一次。如果p0等于p1,则前面的元素都是0,所以p0和p1也要向前移动一次

var sortColors = function (nums) {
    let p0 = 0 //指向0
    let p1 = 0 //指向0

    for (let i = 0; i < nums.length; i++) {
        if (nums[i] === 1) {//如果当前i指向的元素等于1,则交换当前元素和p1指向的元素
            let temp = nums[p1]
            nums[p1] = nums[i]
            nums[i] = temp
            p1++
        } else if (nums[i] === 0) {//如果当前i指向的元素等于0,则交换当前元素和p0指向的元素
            let temp = nums[p0]
            nums[p0] = nums[i]
            nums[i] = temp
            //如果p0小于p1 则此时p0指向的元素是1,与i位置元素交换之后 这个交换过去的1位置就不对了 所以交换过去的1需要在和p1交换一下
            if (p0 < p1) {
                temp = nums[i];
                nums[i] = nums[p1];
                nums[p1] = temp;
            }
            //每次交换0之后都要移动p0和p1,如果p0===p1,则前面都是0,如果p0<p1,前面的代码已经交换了两次
            p0++
            p1++
        }
    }
};