[路飞][LeetCode]75_颜色分类

132 阅读2分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

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

提示:

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

暴力解

因为sort被ban了,这次我们换一种暴力解的思路。

  • 先找出所有对应数字的个数
  • 按照个数依次写回原数组
var sortColors = function(nums) {
    const arr = [0,0,0] // 统计 0 1 2分别出现的次数
    for(let num of nums){
        arr[num]++
    }
    let index = 0  // 用来标记数组下标
    for(let i = 0;i<arr.length;i++) {
        while(arr[i]){
            nums[index]= i // 向数组中依次写回对应次数的 0 1 2
            arr[i]--
            index++
        }
    }
    return nums
};

解题思路

  • 我们定义 2 个指针,一个用来记录 0 的索引,另一个用来记录 2
  • 进行左右互换,碰到 0就向左移动,碰到 2就向右移动

解题代码

var sortColors = function(nums) {
    let p0 = 0  // 初始化 0 表示该索引左边全是0
    let p2 = nums.length-1 // 初始化 2 表示该索引左边全是2
    for(let i = p0;i<=p2;i++){ 在 p0 - p2 的区间内遍历 nums
        if(nums[i]==0){ // 遇到0 交换到左边
            [nums[p0],nums[i]] = [nums[i],nums[p0]]
            p0++
        }else if(nums[i]==2){// 遇到0 交换到右边
            [nums[p2],nums[i]] = [nums[i],nums[p2]]
            p2--
            i-- // 方便二次校验是否交换到一个2
        }
    }
    return nums
};

满身的泥泞和风霜,都没抖落他眼里光和对爱的向往。

如有任何问题或建议,欢迎留言讨论!