leetcode-数组-75- 颜色分类

94 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

Hi, 大家好。我是新人,程序员库里。

今后会按类分享算法题。

今天给大家分享第5道leetcode上数组中使用双指针相关的算法题。

80.删除有序数组中的重复项 II

leetcode地址:leetcode-cn.com/problems/so…

难度

中等

描述

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

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

必须在不使用库的sort函数的情况下解决这个问题。

示例1

输入: nums = [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

示例2

输入: nums = [2,0,1]
输出: [0,1,2]

解法

1.定义一个变量zero,初始值为-1,zero变量用来表示[0...zero]区间全部放0

2.定义一个变量two,初始值为数组的长度,two变量用来表示[two...n-1]区间全部放2

3.[zero+1...n-1]区间全部放1,这样数组中就变成了[0....1....2]

4.开始遍历数组,条件是当i小于数组长度的时候

5.如果遍历的当前元素是1,只把i向右移动一位,即i++。因为 1是在数组的中间,所以不做其他操作。

6.如果遍历的当前元素是2,先将变量two向左移动一位,腾出一个位置,也就是two--。然后将当前的元素2和two所在的位置交换一下位置,此时这个2就移动到了右边

7.如果遍历的当前元素是0,先将zero向右移动一位,腾出一个位置,也就是zero++。然后将当前的元素0和zero所在的位置交换一下位置,此时这个0就移动到了左边。然后继续遍历,即i++。

8.遍历完一遍后,所有0就到了左边,所有2就到了右边,所有1就到了中间。即完成了数组排序。

代码

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
    let zero = -1;// [0...zero] 为0,弄成无效区间
    let two = nums.length;// [two...n-1] 为2,弄成无效区间

    for(let i =0;i<two;){
        if(nums[i] === 1){
            i++
        }else if(nums[i] === 2){
            two--
            [nums[i],nums[two]] = [nums[two],nums[i]]
        }else if(nums[i] === 0){
            zero++
            [nums[i],nums[zero]] = [nums[zero],nums[i]]
            i++
        }
    }
    return nums;
};