剑指 Offer 40.最小的k个数
建立一个最大根堆,将数组的头k个元素插入堆中,根元素就是这k个数中最大的,再让数组后面的元素依次跟根元素比较,如果比根元素小就将根元素删除,插入新元素,这样这个堆中的元素就是最小的k个数了。java的优先队列是最小根堆,因此我们需要自定义一个排序规则。
class Solution {
static Comparator<Integer> cmp = new Comparator<Integer>() {
public int compare(Integer e1, Integer e2) {
return e2 - e1;
}
};
public int[] getLeastNumbers(int[] arr, int k) {
if(arr == null) return new int[0];
if(k == 0) return new int[0];
Queue<Integer> q = new PriorityQueue<Integer>(cmp);
for(int i = 0; i < k; i++) {
q.add(arr[i]);
}
for(int i = k; i < arr.length; i++) {
if(arr[i] < q.peek()) {
q.poll();
q.add(arr[i]);
}
}
int[] a = new int[q.size()];
int i = 0;
while(!q.isEmpty()) {
a[i] = q.poll();
i++;
}
return a;
}
}