347.前K個の高周波要素(Leecodeブラシ問題)
5621 ワード
非空の整数配列が与えられ、周波数が現れる前に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に伝えることができます.
コードは次のとおりです.
入力:nums=[1,1,1,2,2,3],k=2出力:[1,2]
例2:
入力:nums=[1]、k=1出力:[1]
この問題の構想は:1.まず、各数値の回数を統計します.unordered_mapは仁を譲らない.2.私たちは前K大を選びます.よく知っています.priority_queueでいいです.
考えは簡単ですが、書く過程でいくつかの問題を見つけました.
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;
}