leetcode 75. 颜色分类


本题 题目链接

题目描述


我的题解

方法:三路快排

思路分析

  • 三路快排的应用+变形一下
  • 因为本题最多只有3个数,所以令 v 为2,只进行一次三路快排调用即可
  • 下面先给出三路快排的原模版。再给出我本题的代码

  • 三路快排的变量情况图:

// 三项切分的快速排序
private static void quick3way(int[] a, int lo, int hi) {
    if(hi <= lo)
        return;
    int lt = lo, i = lo+1, gt = hi;
    int v = a[lo];
    while(i <= gt) {
        if(a[i] < v) {
            int tmp = a[i];
            a[i++] = a[lt];
            a[lt++] = tmp;
        } else if(a[i] > v) {
            int tmp = a[i];
            a[i] = a[gt];
            a[gt--] = tmp;
        } else i++;
    }
    quick3way(a, lo, lt-1);
    quick3way(a, gt+1, hi);
}

我本题的代码如下

    public void sortColors(int[] nums) {
        if (nums == null)return;
        quick3way(nums,0,nums.length-1);
        // System.out.println(Arrays.toString(nums));
    }

    private void quick3way(int[] nums, int lo, int hi) {
        if (hi<=lo) return ;
        int lt=lo;
        int gt = hi;
        int i=lo;
        int v = 1;
        while (i <= gt) {
            if (nums[i] < v) {
                if (i == lt) {
                    lt++;
                    i++;
                } else {
                    int tmp = nums[i];
                    nums[i] = nums[lt];
                    nums[lt++] = tmp;
                }
            } else if (nums[i] > v) {
                int tmp = nums[i];
                nums[i] = nums[gt];
                nums[gt--] = tmp;
            } else i++;
        }
    }

原文地址:https://www.cnblogs.com/duduwy/p/13413671.html