题目:最小的K个数
思路:最大堆
最大堆是指,堆顶元素是堆中所有元素最大的一个,可以用优先队列实现这一数据结构,需要注意的是,对于基本数据类型,java默认优先队列升序,即相当于一个最小堆,所以我们需要重写cmopare()方法。
先把数组前K个数放进堆里,剩余元素分别与堆顶元素比较,若小于堆顶元素,则弹出堆顶元素,把该元素放进堆里。
其实冒泡排序也可以完成。冒泡排序每次可以找出一个最小值,这样外层循环K次即可得到答案。
代码:
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
int n = input.length;
ArrayList<Integer> res = new ArrayList<>();
if (k <= 0 || k > n) {
return res;
}
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){
public int compare(Integer n1, Integer n2) {
return n2 - n1;
}
});
for (int i = 0; i < k; i ++) {
queue.offer(input[i]);
}
for (int i = k; i < n; i ++) {
if (input[i] < queue.peek()) {
queue.poll();
queue.offer(input[i]);
}
}
for (Integer i : queue) {
res.add(i);
}
return res;
}
}