剑指 Offer 40. 最小的k个数java题解

快排:https://blog.csdn.net/nrsc272420199/article/details/82587933

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if(k==0||arr.length==0){
            return new int[0];
        }
        return quickSearch(arr,0,arr.length-1,k-1);
    }
    private int[] quickSearch(int[] nums,int lo,int hi,int k){
        int j=partition(nums,lo,hi);
        if(j==k){
            return Arrays.copyOf(nums,j+1);
        }
        return j>k?quickSearch(nums,lo,j-1,k):quickSearch(nums,j+1,hi,k);
    }
    // 快排切分,返回下标j,使得比nums[j]小的数都在j的左边,比nums[j]大的数都在j的右边。
    private int partition(int[] nums,int lo,int hi){
        int v=nums[lo];
        int i=lo,j=hi+1;
        while(true){
            while(++i<=hi&&nums[i]<v);
            while(--j>=lo&&nums[j]>v);
            if(i>=j){
                break;
            }
            int t=nums[j];
            nums[j]=nums[i];
            nums[i]=t;
        }
        nums[lo]=nums[j];
        nums[j]=v;
        return j;
    }
}

剑指 Offer 40. 最小的k个数java题解_第1张图片
时间复杂度O(N)

你可能感兴趣的:(剑指Offer,leetcode,数据结构,算法,快速排序,java)