剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数
题目
链接
https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/
问题描述
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
提示
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
思路
采用优先队列,用大根堆,然后往里面塞数字,大的数字就丢弃,小的就塞入。
最后输出数据。
复杂度分析
时间复杂度 O(nlogk)
空间复杂度 O(k)
代码
Java
public int[] getLeastNumbers(int[] arr, int k) {
if (k == 0 || arr.length == 0) {
return new int[0];
}
Queue<Integer> queue = new PriorityQueue<>((v1, v2) -> v2 - v1);
for (int num : arr) {
if (queue.size() < k) {
queue.offer(num);
} else if (num < queue.peek()) {
queue.poll();
queue.offer(num);
}
}
int[] res = new int[queue.size()];
int idx = 0;
for (int num : queue) {
res[idx++] = num;
}
return res;
}