アイデア
質問が最終的に返す必要があるのは、最も高い頻度を持つ最初のk個の要素です。ヒープのデータ構造の助けを借りて、k個の頻度の後の要素を処理する必要がなく、時間計算量がさらに最適化。
具体的な操作は次のとおりです。
- ハッシュテーブルは再び周波数配列要素の統計を横断、デジタル地図とその出現を作成します
- k個の要素で最小ヒープを維持する
- 新しい要素が最上位の要素(ヒープ内で最も頻度の低い要素)と比較されるたび
- 新しい要素の頻度がヒープの上部にある要素よりも大きい場合は、ヒープの上部にある要素をポップして、新しい要素をヒープに追加します。
- 最後に、ヒープ内のk個の要素は最初のk個の高周波要素です
時間の複雑さ
コード
class Solution {
public:
struct cmp{
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int>m;
//利用哈希表记录每个整数出现的次数
for(int i=0;i<nums.size();++i)
m[nums[i]]++;
//建立小顶堆
priority_queue<pair<int, int>,vector<pair<int, int>>,cmp> que;
for(map<int, int>::iterator it=m.begin();it!=m.end();++it)
{
que.push(*it);
if(que.size()>k) que.pop();
}
//返回结果
vector<int>result;
for(int i=k-1;i>=0;--i)
{
result.push_back(que.top().first);
que.pop();
}
return result;
}
};