剑指Offer第二十九题:最小的k个数
使用一个最大堆:根结点最大
-
最大堆先存储数组中前k个元素,将数组中其余的元素逐一与最大堆顶元素比较,如果小于堆顶元素,就将堆顶元素移除,并添加当前元素。
-
实现:
-
使用PriorityQueue来实现最大堆,内置比较器(Integer o1,Integer o2){当o1<o2时,返回-1,否则返回1,可以实现队头元素大于队尾元素,PriorityQueue的底层是用最大堆或者最小堆实现的}
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> list = new ArrayList<>();
if(input == null || k == 0 || k>input.length){
return list;
}
Queue <Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
if(o1<o2) {
return 1;
}else {
return -1;
}
}
});
for(int i = 0; i<k; i++){
queue.add(input[i]);
}
for(int i = k; i<input.length; i++){
if(queue.peek()>input[i]){
queue.poll();
queue.offer(input[i]);
}
}
while(!queue.isEmpty()){
list.add(queue.poll());
}
return list;
}
}