LeetCode HOT 100:颜色分类(荷兰国旗问题)

题目:75. 颜色分类

题目描述:

给你一个数组,元素只为0、1、2,分别代表红色、白色和蓝色。将数组中相同颜色的元素移动到一起,并将它们排序。也就是将0都排在最前面,1排在中间,2排在最后。题目要求不申请额外空间,原地移动。

思路:

这道题的思路很清晰,就是荷兰国旗问题。用解荷兰国旗问题的方法解这道题就行。那么荷兰国旗问题如何解呢?设置两个指针,分别命名为lessmoreless指针代表[0...less]区域都是小于某个值的,more指针代表[more...数组长度 - 1]区域都是大于某个值的。这样,中间部分一定就是等于某个值的。最终就将数组划分为三块区域了。
那么指针该如何移动呢?如果当前遍历到的元素小于某个值,就将less++,然后将less和当前下标交换,如果大于某个值,就将more--,然后将more和当前下标交换,相等就接着遍历下一个,不用交换。一直遍历到more下标结束。因为more后面的元素都是大于某个值的了,所以不用再遍历了。

步骤:

1、设置lessmore指针并初始化
2、按照规则,移动两个指针,并元素交换
3、返回数组

代码:

    public void sortColors(int[] nums) {
        partition(nums, 0, nums.length - 1, 1);
    }

    // 将数组[L...R]范围,划分为 <val, =val, >val 三个区域
    public void partition(int[] nums, int L, int R, int val) {
        int less = L - 1;
        int more = R + 1;
        int index = L;

        while (index < more) {
            if (nums[index] == val) {
                index++;
            } else if (nums[index] < val) {
                less++;
                swap(nums, less, index);
                index++;
            } else {
                more--;
                swap(nums, index, more);
            }
        }
    }

    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
posted @ 2022-12-21 15:55  煜航  阅读(82)  评论(0编辑  收藏  举报