LeetCode 数据结构基础 - 颜色分类

189 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

颜色分类

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

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

必须在不使用库的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] 为 0、1 或 2

思路分析

方法一

分析题目可以得知,按照颜色分类实际是将数组升序排列,那么可以使用双重循环,来将数组升序排列即可。

方法二

  1. 遍历数组,将红白蓝分别含有多少个统计出来。
  2. 循环数组,将对应红白蓝个数的数组位置赋对应的红白蓝的数值即可。

AC 代码

方法一

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
    for(let i=0;i<nums.length;i++) {
        for(let j=i+1;j<nums.length;j++) {
            if(nums[i] >= nums[j]) {
                [nums[i], nums[j]] = [nums[j], nums[i]]
            }
        }
    }
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了51.51%的用户
  • 内存消耗:41.5 MB, 在所有 JavaScript 提交中击败了9.36%的用户
  • 通过测试用例:87 / 87

方法二

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
    let red = 0
    let white = 0
    let blue = 0
    for(let i = 0; i < nums.length; i++) {
        if(nums[i] === 0) red++
        if(nums[i] === 1) white++
        if(nums[i] === 2) blue++
    }
    for(let i = 0; i < nums.length; i++) {
        if(i < red) nums[i] = 0
        else if(i >= red && i < red + white) nums[i] = 1
        else nums[i] = 2
    }
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了51.51%的用户
  • 内存消耗:41 MB, 在所有 JavaScript 提交中击败了47.56%的用户
  • 通过测试用例:87 / 87

END