剑指 Offer 40. 最小的k个数(快排)

不好返回的是时候,就用void,然后在主函数中返回。

思路是在快排中只增加了一句话:

if(k == i)

    return;

如果基准数的下标,和k相等,就return。

假如k=7,数组下标为7的时候是第 8个数,第8个数前的数都比第8个数小。

其实在像解答里在arr[i] = pivot;之后判断,可以判断if(k == i + 1),因为前6个数加上基准数也属于题目要求。

class Solution {
    int k;
    public int[] getLeastNumbers(int[] arr, int k) {
        if (k >= arr.length) return arr;
        this.k = k;
        QuickSort(arr, 0, arr.length - 1);
        return Arrays.copyOf(arr, k);
    }

    void QuickSort(int[] arr, int left, int right){
        if(left >= right)
            return ;
        int i = left, j = right, pivot = arr[i];
        while(i < j){
            while(i < j && arr[j] >= pivot) j--;
            arr[i] = arr[j];
            while(i < j && arr[i] <= pivot) i++;
            arr[j] = arr[i];
        }
        arr[i] = pivot;
        if(k == i)
            return;
        QuickSort(arr, left, i - 1);
        QuickSort(arr, i + 1, right);
    }
}

如果剪枝速度将会更快,其实就是在递归时加了判断,避免不必要的递归。

class Solution {
    int k;
    public int[] getLeastNumbers(int[] arr, int k) {
        if (k >= arr.length) return arr;
        this.k = k;
        QuickSort(arr, 0, arr.length - 1);
        return Arrays.copyOf(arr, k);
    }

    void QuickSort(int[] arr, int left, int right){
        if(left >= right)
            return ;
        int i = left, j = right, pivot = arr[i];
        while(i < j){
            while(i < j && arr[j] >= pivot) j--;
            arr[i] = arr[j];
            while(i < j && arr[i] <= pivot) i++;
            arr[j] = arr[i];
        }
        arr[i] = pivot;
        if(k == i)
            return;
        if(k < i) QuickSort(arr, left, i - 1);
        if(k > i) QuickSort(arr, i + 1, right);
    }
}

剑指 Offer 40. 最小的k个数

posted @ 2021-04-22 22:14  星予  阅读(61)  评论(0编辑  收藏  举报