剑指 Offer 40. 最小的k个数
常规法
public int[] getLeastNumbers(int[] arr, int k) {int[] vec = new int[k];Arrays.sort(arr);for (int i = 0; i < k; ++i) {vec[i] = arr[i];}return vec;}作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/zui-xiao-de-kge-shu-by-leetcode-solution/
堆
class Solution {public int[] getLeastNumbers(int[] arr, int k) {int[] vec = new int[k];if (k == 0) { // 排除 0 的情况return vec;}PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {public int compare(Integer num1, Integer num2) {return num2 - num1;}});for (int i = 0; i < k; ++i) {queue.offer(arr[i]);}for (int i = k; i < arr.length; ++i) {if (queue.peek() > arr[i]) {queue.poll();queue.offer(arr[i]);}}for (int i = 0; i < k; ++i) {vec[i] = queue.poll();}return vec;}}作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/zui-xiao-de-kge-shu-by-leetcode-solution/
class Solution {public int[] getLeastNumbers(int[] arr, int k) {if (k == 0) {return new int[0];}// 使用一个最大堆(大顶堆)// Java 的 PriorityQueue 默认是小顶堆,添加 comparator 参数使其变成最大堆Queue<Integer> heap = new PriorityQueue<>(k, (i1, i2) -> Integer.compare(i2, i1));for (int e : arr) {// 当前数字小于堆顶元素才会入堆if (heap.isEmpty() || heap.size() < k || e < heap.peek()) {heap.offer(e);}if (heap.size() > k) {heap.poll(); // 删除堆顶最大元素}}// 将堆中的元素存入数组int[] res = new int[heap.size()];int j = 0;for (int e : heap) {res[j++] = e;}return res;}// 作者:nettee// 链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/tu-jie-top-k-wen-ti-de-liang-chong-jie-fa-you-lie-/}
Arrays.sort()
时间复杂度 n_log_n
_
堆,时间复杂度 O(nlogk)。
