29. 最小的k个数

题目:输入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);
                }


猜你喜欢

转载自blog.csdn.net/weixin_39605679/article/details/80922918