基本思路
Top K问题。动态维护一个有K个数的大顶堆,每次将数组中的元素与堆顶比较,即与这K个数中的最大数比,若小于这个最大数,则就有资格进入最小的K个数的行列,用该数组元素替换掉堆顶元素,同时进行下沉的堆调整过程;否则,就什么也不做,继续将数组中下一个数与堆顶元素比较。遍历完该数组后,堆中的K个数即为最小的K个数,输出堆即可。堆直接采用优先级队列PriorityQueue来实现的。
AC代码(Java)
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> r=new ArrayList<Integer>();
if(input==null || input.length==0 || k<=0 || k>input.length){
return r;
}
PriorityQueue<Integer> q=new PriorityQueue<Integer>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
for(int i=0; i<input.length; i++){
if(q.size()<k){
q.offer(input[i]);
}else{
if(q.peek()>input[i]){
q.poll();
q.offer(input[i]);
}
}
}
for(Integer num : q){
r.add(num);
}
return r;
}
}