leetcode347。最初のk個の高周波要素(ハッシュヒープ)

アイデア

質問が最終的に返す必要があるのは、最も高い頻度を持つ最初の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;
    }
};

おすすめ

転載: blog.csdn.net/weixin_45019830/article/details/115308863