面试题40. 最小的k个数

题目描述

输入整数数组 $arr$ ,找出其中最小的 $k$ 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

1
2
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

示例 2:

1
2
输入:arr = [0,1,2,1], k = 1
输出:[0]

限制:

  • $0 <= k <= arr.length <= 10000$
  • $0 <= arr[i] <= 10000$

算法

(堆)) $O(n)$

使用大根堆存储 $k$ 个最小的数,怎么存呢,遍历每个数,先加到大根堆中,如果堆的大小大于 $k$ 则弹出一个堆顶,所以数都遍历完后,此时堆中存的就是最小的 $k$ 个数。

时间复杂度

$O(n)$

空间复杂度

$O(n)$

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
priority_queue<int> heap;
for (auto x : arr) {
heap.push(x);
if (heap.size() > k)
heap.pop();
}
vector<int> res;
while (heap.size()) {
res.push_back(heap.top());
heap.pop();
}
return res;
}
};
Author: tonngw
Link: https://tonngw.com/2022/07/08/剑指 Offer/面试题40. 最小的k个数/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.