import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param input int整型一维数组 * @param k int整型 * @return int整型ArrayList */ public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) { // write code here // 核心思想:采用传统堆,至少能够达到O(NlogN)的时间复杂度 // 至于如何达到O(NlogK),应当是改进堆,使之仅仅只有K个元素 // 题解中的方法:先把前K个元素建大根堆,然后往后遍历,若小于堆顶元素,则堆顶出堆,新元素入堆 // 遍历结束后,这K个元素就是最小的K个元素 // 0.处理特殊情况 ArrayList<Integer> result = new ArrayList<>(); if (k == 0) { return result; } // 1.创建并初始化大根堆,前K个元素入堆 PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> o2 - o1); for (int i = 0; i < k; i++) { pq.add(input[i]); } // 2.往后遍历数组,尝试用更小的元素替换掉堆中的最大元素 for (int i = k; i < input.length; i++) { if (input[i] < pq.peek()) { // 若当前元素小于堆中最大元素,则弹出最大元素,让当前元素入堆顶替 pq.poll(); pq.add(input[i]); } } // 3.此时堆中的k个元素就是所求的k个最小值 while (!pq.isEmpty()) { result.add(pq.poll()); } return result; } }