[路飞]_颜色分类

211 阅读1分钟

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]

题解

排序

一种取巧的方法,将数组排序输出即可;后来仔细看了原题,题目要求原地排序;尴尬

排序代码

var sortColors = function (nums) {
  return nums.sort((a,b)=>a-b)
}

双指针

原地修改数据,数据分成三份;双指针呀。

  • 左侧指针left指向0;
  • 右侧指针right指向2
  • 枚举数组,如果当前整数为0,将整数与left交换
  • 如果整数为1,跳过
  • 如果整数为2,将整数与right处整数交换,注意,交换后要判断一下right处过来的整数是多少
  • 返回num

双指针代码

var sortColors = function (nums) {
  const len = nums.length
  let left = 0
  let right = len - 1
  let k = 0
  while (k <= right) {
    if (nums[k] === 0) {
      const t = nums[k]
      nums[k] = nums[left]
      nums[left] = t
      left++
      k++
    } else if (nums[k] === 1) {
      k++
    } else if (nums[k] === 2) {
      const t = nums[k]
      nums[k] = nums[right]
      nums[right] = t
      right--
    }
  }
  return nums
}