问题重述:
题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个主子,则最小的4个数字是1、2、3、4。
思路解析:
在不改变原数组的基础上,我们可以建立一个大根堆,然后将数组的前k个数字插入到大根堆中。然后从位置k处开始继续遍历数组,依次与堆顶元素比较,如果这个元素小于堆顶元素,那么我们剔除堆顶元素,并且将此元素插入到堆中。当遍历完整个数组之后,堆中的元素就是最小的k个数。
代码实现:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
if(k<1)
return vector<int>();
if(k>input.size())
return vector<int>();
vector<int> result;
priority_queue<int,vector<int>,less<int>> heap;//大根队
for(int i = 0;i<k;++i)
{
heap.push(input[i]);
}
for(int i = k;i<input.size();++i)
{
if(input[i]<heap.top())
{
heap.pop();
heap.push(input[i]);
}
}
while(!heap.empty())
{
result.push_back(heap.top());
heap.pop();
}
return result;
}
};