题解 | #最小的K个数#

最小的K个数

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

构建小根堆,然后取 k 次根,每次取完后再堆化

import java.util.ArrayList;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> res = new ArrayList<>();
        buildHead(input,input.length);
        for (int i = 1; i <= k; i++) {
            res.add(input[0]);
            swap(input,0,input.length-i);
            heapify(input,0,input.length-i);
        }
        return res;
    }

    // 建堆
    public void buildHead(int[] arr,int n) {
        for (int i = (n/2)-1; i >=0; i--) {
            heapify(arr,i,n);
        }
    }

    // 堆化
    public void heapify(int[] arr,int i,int n) {
        while (i*2+1<n) {
            int child = i * 2 + 1;
            if (child+1<n && arr[child+1]<arr[child]) child++;
            // 说明堆化完成了,不用再进行了
            if (!(arr[child] <arr[i])) return;
            swap(arr,i,child);
            i=child;
        }
    }

    public void swap(int[] arr,int x,int y) {
        int tmp = arr[x];
        arr[x]=arr[y];
        arr[y]=tmp;
    }
}
全部评论

相关推荐

10-14 21:00
门头沟学院 Java
吃花椒的狸猫:这个人说的倒是实话,特别是小公司,一个实习生哪里来的那么多要求
点赞 评论 收藏
分享
10-22 12:03
山东大学 Java
程序员小白条:26届一般都得有实习,项目可以随便写的,如果不是开源社区的项目,随便包装,技术栈也是一样,所以本质应该找学历厂,多投投央国企和银行,技术要求稍微低一点的,或者国企控股那种,纯互联网一般都得要干活
应届生简历当中,HR最关...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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