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

最小的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-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
牛客38347925...:9,2学生暑期实习失利开始投小厂,给这群人整自信了
点赞 评论 收藏
分享
06-19 19:06
门头沟学院 Java
码农索隆:别去东软,真学不到东西,真事
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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