LeetCode 面试题 17.14. 最小K个数

面试题 17.14. 最小K个数 LeetCode
堆排序的一道题
主要思路就是根据arr的前面k的数构造一个大根堆
对于之后k~arr.length个数,每个元素与堆定元素比较,如果大于堆顶元素就把堆顶元素换掉之后重新构造大顶堆,需要注意的是重新构造大顶堆的时候只需要拍堆顶元素的位置就可以了,如果对整个堆重排的话可能会超时

/**
 * @Description 我们写代码,靠的是技术(狗头)
 * @auther admin
 * @create 2020-07-09 17:46
 */
public class Solution17_14 {

    /**
     * 构造大根堆
     * @param temp
     * @param k
     */
    public void CreateHeap(int[] temp,int k){
        /**
         * 从最后一个非叶子节点开始搜索
         */
        for(int i =k/2-1;i>=0;i--){
            HeadAdjust(temp,i,k);
        }
    }

    /**
     *构建的数组
     * @param temp
     * 要调整的端点
     * @param i
     * @param len
     */
    public void HeadAdjust(int[] temp,int i,int len){
        int val = temp[i];
        /**
         * k为“下坠”后可能的位置
         */
        for(int k = i*2+1;k<len;k=2*k+1){
            if(k<len-1&&temp[k]<temp[k+1])
                k++;
            if(val>temp[k])break;
            else {
                temp[i] = temp[k];
                i = k;
            }
        }
        temp[i] = val;
    }

    public void swap(int a,int b){
        int temp = 0;
        temp = a;
        a = b;
        b = temp;
    }


    /**
     * 大根堆的使用
     * @param arr
     * @param k
     * @return
     */

    public int[] smallestK(int[] arr, int k) {
        if(arr==null)return new int[]{};
        if(k>arr.length)return arr;
        /**
         * 截取前k个值构造大根堆
         */
        CreateHeap(arr,k);
        for(int i = k;i<arr.length;i++){
            if(arr[0]>arr[i]){
                arr[0] = arr[i];
                HeadAdjust(arr,0,k);
            }
        }
        int[] sln = new int[k];

        for(int i = 0;i<k;i++){
            sln[i] = arr[i];
        }
        return sln;
    }

    public static void main(String[] args) {
        Solution17_14 solution17_14 = new Solution17_14();

        int[] a =
                solution17_14.smallestK(new int[]{1,3,55,7,23,4,6,8},4);
        for(int i = 0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
    }
}

你可能感兴趣的:(LeetCode 面试题 17.14. 最小K个数)