输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解法1: 最大堆
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> rr;
if(input.empty()||k > input.size()|| k<=0)
return rr;
for(int i = 0; i < k; i++)
{
rr.push_back(input[i]);
}
make_heap(rr.begin(),rr.end());
for(int i = k; i < input.size();i++)
{
if(input[i]<rr[0])
{
pop_heap(rr.begin(),rr.end());
rr.pop_back();
rr.push_back(input[i]);
push_heap(rr.begin(),rr.end());
}
}
return rr;
}
解法2:multiset
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> rr;
if(input.empty()||k > input.size()|| k<=0)
return rr;
multiset<int, greater<int>> leastNumbers;
multiset<int, greater<int> >::iterator iterGreater;
for(int i = 0; i < input.size(); i++)
{
if(leastNumbers.size() < k)
leastNumbers.insert(input[i]);
else
{
iterGreater = leastNumbers.begin();
if(input[i] < *iterGreater)
{
leastNumbers.erase(*iterGreater);
leastNumbers.insert(input[i]);
}
}
}
for(auto ii = leastNumbers.begin(); ii!=leastNumbers.end();ii++)
rr.push_back(*ii);
return rr;
}