問題重述:
題目:輸入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;
}
};