题解 | #求二叉树的层序遍历#

最小的K个数

http://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf

构建大根堆,sift函数进行调整,堆的构建是从最后面最小单位构建的,前k个构建完成后,对后面的数和堆顶比较,如果比堆顶小就覆盖堆顶,并进行一次sift函数也就是堆构建


public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> arr= new ArrayList<Integer>();
        
        if(input.length==0|| k==0){
            return arr;
        }
        int[] heap = new int[k];
        for(int i=0;i<k;i++){
            heap[i]=input[i];
        }
        int low=(k-2)/2;
        
        for(int i=low;i>=0;i--){
            sift(heap,i,k-1);
        }
        for(int i=k;i<input.length;i++){
            if(heap[0]>input[i]){
                heap[0]=input[i];
                sift(heap,0,k-1);
            }
        }
        for(int i=0;i<k;i++){
            arr.add(heap[i]);
        }
        return arr;
    }
    public void sift(int[] arr, int low,int high){
        int i=low;
        int j=low*2+1;
        int temp = arr[low];
        while(j<=high){
            if(j+1<=high && arr[j]< arr[j+1]){
                j= j+1;
            }
            if(arr[j]>temp){
                arr[i]=arr[j];
                i=j;
                j=i*2+1;
            }else{
                arr[i]=temp;
                break;
            }
        }
        arr[i] = temp;
    }
}
全部评论

相关推荐

07-07 12:25
门头沟学院 Java
程序员牛肉:你这个智邮公司做的就是那个乐山市税务系统的服务吗?
点赞 评论 收藏
分享
zzzzhz:兄弟你先猛猛投简历至少三百家,能约到面试就去面。最近可以速成智能小车,智慧家居烂大街的项目,不需要自己写,只需要把里面的代码讲解看明白就行。把其中涉及到的八股文都拿出来单独背一下,我去年找工作就一个智能小车智慧家居找了10k差不多。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务