剑指offer-29:最小的K个数
堆排序的思想,维护一个大小为k的大根堆,将数组元素都push进堆,当堆中的数大于k时弹出堆顶元素。注意弹出堆顶到res的顺序是从大到小的k个数,要进行逆序操作,需考虑k大于input大小的边界情况。
建立大小为k的堆的时间复杂度为O(logk),该操作进行n次,因此总体的时间复杂度为O(nlogk)。具体代码如下:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
priority_queue<int> heap; //优先队列先小后大
for(auto x : input){
heap.push(x);
if(heap.size() > k) heap.pop();
}
vector<int> res;
if(k > input.size()) return res;
while(heap.size()){
res.push_back(heap.top());
heap.pop();
}
reverse(res.begin(), res.end());
return res;
}
};