题解 | #最小的K个数#
最小的K个数
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
//想到了主持人的那个问题,主持人题目要难一点,除了用最小堆,还要把活动时间进行排序
//主持人用的是最小堆,默认的就行。它需要先对活动时间进行排序,依次安排最早的活动
// 实现最大堆,默认的PriorityQueue实现的是最小堆,就是主持人那题用到的
// 这里面需要实现最大堆,也就是堆顶存放的是最大值,之后把最大值挤掉,留下的就是小的,不用先对数组进行排序
// 最大堆的实现需要重新定义compare方法
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer a,Integer b){
return b.compareTo(a);
}
});
for (int i = 0; i < input.length; i++) {
//把四个最大数字装入堆,然后依次把堆顶让出来
pq.offer(input[i]);
if (pq.size() > k) {
pq.poll();
}
}
//这样堆里面的k个数字就是最小的k个数字了,现在问题就是把堆转换为ArrayList即可
ArrayList<Integer> res = new ArrayList<>(pq);
return res;
}
}
知识点: PriorityQueue 优先级队列,默认是最小堆,最大堆需要重新定义compare方法。
因为要留下最小的数字,把最大的数字依次挤走,所以可以确定本题使用最大堆。
