题号:no97
题目名:最小K个数
原题URL:https://leetcode-cn.com/problems/smallest-k-lcci/
题目描述
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例
示例 1:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
限制
0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))
思路
1.最大优先队列,每次都存下K个数,每次最外边的数都是最大的
2.如果当前值小于最大值,就将队列的最大值出队,然后将当前值加入,如此往复
3.最后将队列的数进行出队
解题代码
public class Solution {
public int[] smallestK(int[] arr, int k) {
//使用优先队列处理问题
if(arr ==null||arr.length==0||k==0) return new int[]{};
if(k>arr.length) return arr;
PriorityQueue<Integer> maxQueue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for (int i : arr) {
//队列里面不够k个,直接加入
if(maxQueue.size()<k) {
maxQueue.add(i);
continue;
}
//当前位置小于队列中的最小值
if(maxQueue.peek()>i) {
maxQueue.poll();
maxQueue.add(i);
}
}
int[] res = new int[k];
while (!maxQueue.isEmpty()) {
res[--k] = maxQueue.poll();
}
return res;
}
}