题目描述:
解题思路:
要求返回数组中最小的k个元素,使用java的最大堆数据结构。java的PriorityQueue默认为最小堆,需要写一个比较器将最小堆变为最大堆即可。
PriorityQueue<Integer> heap=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
那么将前k个元素放入到最大堆中,遍历length-k个元素,当arr[i]小于heap.peek()时,将heap的顶部元素弹出,将arr[i]放入堆中。
特殊情况:当arr为空或者k为0则返回空数组。当k不小于arr数组的长度则返回整个arr数组。
代码:
class Solution {
public int[] smallestK(int[] arr, int k) {
int[] result=new int[k];
if(arr==null || k==0){
return result;
}
PriorityQueue<Integer> heap=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
if(arr.length<k){
return arr;
}
for(int i=0;i<k;i++){
heap.offer(arr[i]);
}
for(int i=k;i<arr.length;i++){
if(heap.peek()>arr[i]){
heap.poll();
heap.offer(arr[i]);
}else{
continue;
}
}
for(int i=0;i<k;i++){
result[i]=heap.poll();
}
return result;
}
}