题解 | #最小的K个数#

最小的K个数

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

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) {
        if(k==0||input.length==0){
            return new ArrayList<Integer>();
        }
        int[] temp = new int[k];
        Arrays.sort(input);
        ArrayList<Integer> res = new ArrayList<Integer>();
        for(int i=0;i<k;++i){
            res.add(input[i]);
        }
        return res;
    }
}

方法一:使用库函数sort

这个是第一时间能想到的,先将数组利用Arrays的sort方法排序,然后取前k个数即可。

方法二:堆排序

堆分为小根堆和大根堆,顾名思义就是小的在上或者大的在上。Java中提供了优先队列容器,容器内部的次序是基于堆排序的,每进入一个元素都会按堆排序重新排序,取出的元素永远是堆顶元素,即此堆的最大或最小值。

利用这种特性,我们可以建造一个容量为k的大顶堆,每当有较小值出现就替换堆顶值,内部会自动重排序,待所有元素比较结束后,堆中就是最小的四个元素。

步骤:

1、构建大小为k的大顶堆,为数组的前k个元素构成

2、遍历数组,将每个值与堆顶比较,小的入堆

3、堆元素进入数列

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if (k == 0 || input.length == 0) {
            return res;
        }
        //声明一个大根堆,用了lambda表达式实现
        PriorityQueue<Integer> q = new PriorityQueue<>((o1, o2)->o2.compareTo(o1));
        //构建一个大小为k的堆
        for (int i = 0; i < k; ++i) {
            q.offer(input[i]);//数组的前k个值入队
        }
        //遍历比较后面的元素
        for (int i = k; i < input.length; ++i) {
            //有比堆顶更小的元素
            if (q.peek() > input[i]) {
                q.poll();//堆顶出队
                q.offer(input[i]);//新的较小元素进队,进队时会自动根据内部的比较算法进行排序
            }
        }
        for (int i = 0; i < k; ++i) {
            res.add(q.poll());//将堆的每个值添加到数列中
        }
        return res;
    }
}

全部评论

相关推荐

求offer的大角牛:简历写的第一乱,没有突出重点,第二项目太多太杂看不出来有啥核心技术,第三自我评价太多了,第四获得的荣誉没啥含金量,可以不写,反正问题不少
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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