Kの最小数(18)

タイトル

入力[nは整数、最小数Kを見つけます。4,5,1,6,2,7,3,8例えば8つのデジタル入力、最小番号]、3、4 4


方法1:並べ替え
前者の要件を満たすアレイ、及びk値をソートするために直接。しかし、この方法では、ときにデータの多くは、非効率的。
コード:

class Solution {
public:
    vector<int> res;
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        res.clear();
        if(input.empty() || input.size()<k)
        {
            return res;
        }
        sort(input.begin(),input.end());
        for(int i=0;i<k;++i)
        {
            res.push_back(input[i]);
        }
        
        return res;
    }
};

方法2:最大スタック
1、解析:
第一の容器を作成するには、第一容器への入力の前にk個の要素、k値を置くことができます。次いで、要素の後のk + 1は、容器内の要素に匹敵します。容器は、最大値よりも大きい場合、入力は破棄され、以下容器の最大値よりも、それが容器の最大値に置き換えられている場合。
メモリにロードされ、入力されたデータの塊、それは大きな利点を持っていたら、このメソッドは、すべてのデータを必要としません。
2、コード:

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        int len=input.size();
        // 注意处理意外情况
        if(len<=0 || k<=0 ||k>len)
            return vector<int>();
        //将input容器中的前k个元素存入一个新容器中
        vector<int> res(input.begin(),input.begin()+k);
        //创建堆
        make_heap(res.begin(),res.end());
        for(int i=k;i<len;++i)
        {
            //如果堆中的最大值大于输入容器中的值,则将其进行替换
            if(res.front()>input[i])
            {
                pop_heap(res.begin(),res.end());
                res.pop_back();
                res.push_back(input[i]);
                push_heap(res.begin(),res.end());
            }
        }
        sort_heap(res.begin(),res.end());
        return res;
    }
};
公開された213元の記事 ウォン称賛48 ビュー110 000 +

おすすめ

転載: blog.csdn.net/Jeffxu_lib/article/details/104688539