颜色分类

244 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第41天,点击查看活动详情

题目描述

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
来源:力扣(LeetCode)

  • 示例 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

思路分析

根据题意可知,题目给出一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。红色、白色和蓝色分别使用整数 0、 1 和 2代替。
这里数组虽然显示的是数值1、2、3,但是我们不能用数值的大小去进行排序。所以我们这里得用别的方法。这里可以使用指针,用指针指向颜色来区别。这里使用的思想是遇到0就放到前面,遇到2就放到后面,遇到1不做任何操作。
声明三个变量start(指向0的),index作为移动指针,end(指向2的)。循环数组,在循环体中操作元素。判断当前的元素是不是0,若是0的话,就需要将它放到前面去,可以用start指针,用start指针指向的数值和当前的数值替换,并且start加一,index也要加一。如果当前值是1就不做任何处理。遇到2就和end指向的数值调换位置,end就减一,下次有数值2就可以不是换最后一个了。

AC代码

function solution(nums) {
    let start = 0;
    let end = nums.length - 1;
    let index = 0;
    while(index <= end) {
        if(nums[index] === 0) {
            const temp = nums[index];
            nums[index] = nums[start];
            nums[start] = temp;
            start += 1;
            index += 1;
        } else if(nums[index] === 1) {
            index += 1;
        } else {
            const temp = nums[index];
            nums[index] = nums[end];
            nums[end] = temp;
            end -= 1;
        }
    }
    console.log(nums);
}
let nums = [2,0,0,1,1,2];
solution(nums);