题目链接
链接: 最小K个数
题目要求

解题思路
- 使用优先级队列,将
k个元素通过优先级队列建大堆 - 将剩下的
arr.length - k个元素 分别和 堆顶元素即堆中的最大值比较
如果比最大值小 ,删除队头元素,把小的元素入队列,直到遍历完剩下的数组 - 最后把优先级队列存储的最小的
k个数 拷贝到result数组中,并返回
代码实现
java
class Solution {
class MyComparator implements Comparator<Integer> {
@Override
// o1 - o2 建小堆
// o2 - o1 建大堆
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
}
public int[] smallestK(int[] arr, int k) {
int[] result = new int[k];
if(k <= 0){
return result;
}
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new MyComparator());
for (int i = 0; i < k; i++) {
priorityQueue.add(arr[i]);
}
//寻找最小值
for (int i = k; i < arr.length; i++) {
if(arr[i] < priorityQueue.peek()){
priorityQueue.poll();
priorityQueue.add(arr[i]);
}
}
//将结果拷贝到result
for (int i = 0; i < k; i++) {
result[i] = priorityQueue.poll();
}
return result;
}
}