一道常考的题,给定一个无序数组,求其中最大的k个数,腾讯一面面试题。
import java.util.Arrays;
import java.util.PriorityQueue;
class topKdemo{
public static void main(String[] args) {
int[]arr={5,1,2,3,4,5,5,6,7,8,9};
int []res=findTopk(arr, 4);
//输出[6, 7, 8, 9]
System.out.println(Arrays.toString(res));
}
public static int[] findTopk(int[]arr,int k){
//调用java封装的最小堆函数
PriorityQueue<Integer>minQueue=new PriorityQueue<>(k);
//先放入前k个数构成最小堆
for (int num : arr) {
if(minQueue.size()<k)
minQueue.offer(num);
//后面的数比堆头大,则替换,重新构造最小堆
else if(minQueue.peek()<num){
minQueue.poll();
minQueue.offer(num);
}
}
int[]res=new int[k];
for (int i = 0; i < k&&!minQueue.isEmpty(); i++) {
res[i]=minQueue.poll();
}
return res;
}
}