优先队列解决第k个最大的问题
最小的k个数
经典笔试题,可以手写快排
java中提供了现成的PriorityQueue,实现起来简单,比快排慢
本题是求前k小个数,因此用容量为k的大根堆,每次poll出最大的数,那堆中保留的就是前k小。(小根堆需要把所有的元素全部入堆,就是O(NlogN),就不是O(NlogK))
public int[] getLeastNumbers(int[] arr,int k){
if(k==0) return new int[0];
//使用一个大根堆
Queue<Integer> heap=new PriorityQueue<>(k,(i1,i2)->i2-i1);
for(int a:arr){
if(heap.isEmpty()||heap.size()<k||a<heap.peek()){
heap.offer(a);
}
if(heap.size()>k){
heap.poll();
}
}
int[] res=new int[heap.size()];
int j=0;
for(int a:heap){
res[j++]=a;
}
return res;
}
215-数组中第k个最大元素
public int getKbignumber(int[] arr,int k){
Queue<Integer> heap=new PriorityQueue<>();
for(int e:arr){
if(heap.isEmpty()||heap.size()<k||e<heap.peek()){
heap.offer(e);
}
if(heap.size()>k){
heap.poll();
}
}
return heap.poll();