维护一个长度为k的最大堆,
首先填充优先队列到长度为k,此后每添加进一个元素就弹出一个元素,弹出的为队列中的最大元素,因此留下的即为最小的k个元素。

import java.util.*;


public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        for (int i = 0; i < k; i++) {
            pq.offer(input[i]);
        }
        for (int i = k; i < input.length; i++) {
            pq.offer(input[i]);
            pq.poll();
        }
        ArrayList<Integer> ans = new ArrayList<Integer>(pq);
        return ans;
    }
}