题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则其中最小的4个数字是1,2,3,4.
思路:复杂度为o(nlogk)的解法:使用红黑树。
首先判断输入的序列是否为空,k是否大于序列的长度;
然后创建一个基于红黑树的容器(使用降序规则),容器中的第一个元素为最大元素;
遍历输入序列,将前k个元素放入容器中,从第K+1个元素至最后的元素开始,判断其是否小于容器的第一个元素,如果小于的话,则删除容器中第一个元素,将输入序列中的这个元素插入到容器中;反之,则舍弃这个元素;
最后返回容器中的元素;
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if(input.size() == 0 || k > input.size())
return vector<int> ();
multiset<int, greater<int> > leastNumber;
vector<int>::iterator it = input.begin();
for(; it != input.end(); ++ it)
{
if(leastNumber.size() < k)
leastNumber.insert(*it);
else
{
multiset<int, greater<int> >::iterator greatest_it = leastNumber.begin();
if(*it < *greatest_it)
{
leastNumber.erase(greatest_it);
leastNumber.insert(*it);
}
}
}
return vector<int> (leastNumber.begin(), leastNumber.end());
}
};
把这里:
multiset<int, greater<int> >::iterator greatest_it = leastNumber.begin();
if(*it < *greatest_it)
{
leastNumber.erase(greatest_it);
leastNumber.insert(*it);
}
改成下面看着更简练:
if(*it < *leastNumber.begin())
{
leastNumber.erase(leastNumber.begin());
leastNumber.insert(*it);
}