目录
373、查找和最小的K对数字 - 力扣
面试题17.14、最小的K个数 - 力扣
思路:首先根据题目条件取最小的数构造最大堆,遍历原数组,若当前元素个数大于K,判断K和堆顶元素的关系,若当前元素大于堆顶元素,则大于堆中所有元素,当前元素不入堆;若当前元素小于K ,将堆顶元素出堆,当前元素入堆。最后将堆中保存的元素出堆保存在数组中。
//最小的K个数,取小用大
class Num17_14_SmallestK {
public int[] smallestK(int[] arr,int k) {
//边界条件
if (arr.length == 0 || k == 0) {
return new int[0];
}
//构造一个最大堆。JDK默认的是最小堆,使用比较器改造为最大堆
Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
//扫描原数组,优先级队列中只存储K个数
for(int i : arr) {
if (queue.size() < k) {
queue.offer(i);
}else {
//当前元素超过了k值,判断扫描元素和堆顶的关系
//若扫描元素 > 堆顶元素,则 > 堆中所有元素,扫描元素不入堆
int peek = queue.peek();//堆顶元素
if (i > peek) {
continue;
}else {
//此时扫描元素 < 堆顶元素,将堆顶元素出队,再将此元素入堆
queue.poll();
queue.offer