今日主要总结一下剑指 Offer 一道题目,剑指 Offer 40. 最小的k个数
题目:剑指 Offer 40. 最小的k个数
Leetcode题目地址
题目描述:
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
本题重难点
本题很容易想到排序的方法,
其实还有时间复杂度更小的方法,使用优先队列——小顶堆!
解法一:排序
C++代码
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
sort(arr.begin(), arr.end());
vector<int> res;
for(int i = 0; i < k; i++){
res.emplace_back(arr[i]);
}
return res;
}
};
时间复杂度: O(nlogn)
解法二:小顶堆
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> res;
if(k == 0) return res;
priority_queue<int, vector<int>, greater<int>> min_heap;
for(int i = 0; i < arr.size(); i++){
min_heap.emplace(arr[i]);
}
while(k--){
res.emplace_back(min_heap.top());
min_heap.pop();
}
return res;
}
};
时间复杂度: O(nlogk),k就是题目中的k——代表要实时维护的小顶堆元素个数是k,每次插入删除一个数都是O(logk) 的时间复杂度,最多插入n个数,所以是O(nlogk)
总结
本题很容易想到排序的方法,
其实还有时间复杂度更小的方法,使用优先队列——小顶堆!
对应时间复杂度是 O(nlogk),k就是题目中的k——代表要实时维护的小顶堆元素个数是k,每次插入删除一个数都是O(logk) 的时间复杂度,最多插入n个数,所以是O(nlogk)欢迎大家关注本人公众号:编程复盘与思考随笔(关注后可以免费获得本人在csdn发布的资源源码)