颜色分类

177 阅读2分钟

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

leetcode 颜色分类

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

解题: 根据题目的意思0,、1、2分别表示红色、白色和蓝色,然后要求自己实现红色、白色、蓝色的数组顺序排列。简单的办法可以先一次遍历,然后分别记录下各个颜色对应出现的次数就是数量,然后再遍历一次数组,直接按红色、白色、蓝色的数量顺序赋值上对应的值,最后数组就是按颜色排好序的了。

或者使用指针: 使用一个指针来遍历数组,两两交换的操作,首先遍历一次数组,将数组中的所有0的元素交换到数组前面部分,然后再遍历一次将数组的所以1元素交换到0元素的后面,最后所有的2元素都是在数组最后部分,所以整个数组都是按颜色排列有序的了。具体的定义一个pointer指针表示一个颜色的边界,初始指向数组开始位置0,然后开始遍历数组,当遇到0元素时,就将这个元素与指针指向的元素进行交换,然后指针需要后移一位,循环往复保证pointer前的元素都是0,最后遍历结束时指针所指位置前的元素都是0了,然后再从pointer指针位置遍历其余元素,当遇到元素0时,就将当前遍历的元素与指针位置元素交换,同样pointer指针也要后移一位,最后遍历结束时pointer前都是0、1的元素,后边部分如果还有元素那都是2了,最后整个数组都是按0、1、2的顺序排列了。

class Solution {
   public void sortColors(int[] nums) {
        int len = nums.length;
        int pointer = 0;
        for (int i = 0; i < len; i++) {
            if (nums[i] == 0) {
                swap(nums, i, pointer);
                pointer++;
            }
        }
        for (int i = pointer; i < len; i++) {
            if (nums[i] == 1) {
                swap(nums, i, pointer);
                pointer++;
            }
        }
    }

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}