347.前K個の高周波要素(Leecodeブラシ問題)


非空の整数配列が与えられ、周波数が現れる前にkの高い要素が返される.例1:
入力:nums=[1,1,1,2,2,3],k=2出力:[1,2]
例2:
入力:nums=[1]、k=1出力:[1]
この問題の構想は:1.まず、各数値の回数を統計します.unordered_mapは仁を譲らない.2.私たちは前K大を選びます.よく知っています.priority_queueでいいです.
考えは簡単ですが、書く過程でいくつかの問題を見つけました.
  • lambdaで比較しようと思い、lambdaを使っている間にいくつかの問題を発見しました.priority_Queueは、伝達されるテンプレートパラメータの3番目が伝達関数オブジェクトではなく、テンプレートタイプであり、カスタム関数を使用する場合は、必ず初期化することに注意してください.

  • auto funct = [m](int a,int b){return m.at(a) < m.at(b);}; priority_queue q(funct);
    Lambdaとpriority_queue関数値を入力することに注意してください.
    explicit priority_queue( const Compare& compare = Compare(), const Container& cont = Container() );
    2.ここでもう一つの問題は、lambdaの伝達は一般的にconst(mutableを使用しない限り)なので、mをキャプチャして[]で値を取ることはできません.at()を使用するべきです.
    上記の方法はタイムアウトしました!!!私もなぜか分かりません.まさかカスタムlambda式??
    その後、問題解を見て、比較関数をカスタマイズせずに、直接カウントをfirstとし、数字をsecondとしてpriorityに伝えることができます.
    コードは次のとおりです.
    vector<int> topKFrequent(vector<int>& nums, int k) {
    
            unordered_map<int,int> m;
            for(const int a:nums){
                m[a]++;
            }
            // auto funct = [m](int a,int b){return m.at(a) < m.at(b);};
            // priority_queue,decltype(funct)> q(funct);
            priority_queue<pair<int,int>> q;
    
    
            for(auto it = m.begin();it !=  m.end();++it){
                q.push(make_pair(it->second,it->first));
            }
    
            vector<int> ret;
            for(int i = 0 ;i < k;++i){
                ret.push_back((q.top()).second);
                q.pop();
            }
    
            return ret;
    
        }