题目描述
输入N个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解:使用堆这一数据结构,时间复杂度为O(NlgK)
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
// input为空,input元素个数少于k,k非正数,则直接返回
if(input.size() == 0 || input.size() < k || k <= 0)
return vector<int>();
vector<int> heap(input.begin(), input.begin() + k);
// 建堆
// 默认是最大堆,创建最小堆需添加参数greater<int>()
make_heap(heap.begin(), heap.end());
for(auto it = input.begin() + k; it != input.end(); ++it){
// 最大堆的最大元素就在索引为0的位置
if(*it < heap[0]){
//先pop_heap,然后在容器中pop_back删除
pop_heap(heap.begin(), heap.end());
heap.pop_back();
//先在容器中push_back加入,再push_heap
heap.push_back(*it);
push_heap(heap.begin(), heap.end());
}
}
// 从小到大输出, k一般比较小,直接sort即可
sort_heap(heap.begin(), heap.end());
return heap;
}
};