Problem:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
Intuition:
最小的k个数的问题用最大堆来处理,每次最大堆都把较大的数赶出去,留下来自然就是最小的k个数。想象一个场景,一个桶里有100个石头,要挑出里面最小的十个石头,我们怎么挑?把大的90个石头从桶里拿出来剩下的就是最小的十个石头了,那么挑出较大的90个石头需要的工具就是最大堆。
Solution:
public class CodingInterview_040 {
public ArrayList<Integer> GetLeastNumbers_Solution(int[] nums, int k) {
if (k > nums.length || k <= 0)
return new ArrayList<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
for (int num : nums) {
maxHeap.add(num);
if (maxHeap.size() > k)
maxHeap.poll();
}
return new ArrayList<>(maxHeap);
}
public static void main(String[] args) {
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
maxHeap.add(3);
maxHeap.add(1);
maxHeap.add(2);
System.out.println(maxHeap.poll());
System.out.println(maxHeap.poll());
System.out.println(maxHeap.poll());
//3 2 1
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
minHeap.add(3);
minHeap.add(1);
minHeap.add(2);
System.out.println(minHeap.poll());
System.out.println(minHeap.poll());
System.out.println(minHeap.poll());
//1 2 3
}
}