[路飞]_leetcode-75-颜色分类

102 阅读1分钟

题目描述

[题目地址]

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

示例 3:

输入: nums = [0]
输出: [0]

示例 4:

输入: nums = [1]
输出: [1]

提示:

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

进阶:

  • 你可以不使用代码库中的排序函数来解决这道题吗?
  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

解题思路

本题要求我们原地对数组进行排序,所有原地排序其实就是在数组内移动元素的位置。
这里我们采用将所有的 0 移动到数组开头,所有的 2 移动到数组末尾的方式。

  1. 获取数组长度 len,初始化 count = 0 记录循环次数,i = 0 记录当前处理元素下标。
  2. 遍历数组,如果当前元素是 0,且不在数组开头,将其移动到数组开头,如果当前元素是 2,将其移动到数组末尾,并且 i--,因为此时后面的元素都向前移动了一位,为了能处理到所有元素,所以需要 i--,如果当前元素是 1,不进行处理。
  3. 当遍历次数 count = len,就处理过了所有元素。

动画演示

leetcode-75-颜色分类.gif

代码实现

var sortColors = function(nums) {
    const swap = (list,p1,p2) => [list[p1],list[p2]] = [list[p2],list[p1]];
    let red = 0,blue = nums.length -1,p = 0;
    while(p <= blue){
        switch(nums[p]){
            case 0:
                swap(nums,red++,p);
                p++;
                break;
            case 1:
                p++;
                break;
            case 2:
                swap(nums,blue--,p);
                break;
            default: break;    
        }
    }
};

至此我们就完成了 leetcode-75-颜色分类

欢迎建议讨论