1. 程式人生 > 實用技巧 >leetcode 75. 顏色分類

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++;
        }
    }