[Leetcode /優先キューK]高周波要素の前(K優先キューエレメントを求める前に)

問題の説明:

非ヌル整数配列、最初の戻りの発生頻度所与  高い要素。

例1:

入力: NUMS = [1,1,1,2,2,3]、K = 2
 出力: [1,2]

例2:

入力: NUMS = [1]、K = 1つの
 出力: [1]

説明:

  • あなたが与えられたと仮定することができ  、kは 常に合理的であり、かつ1つの≤K≤アレイ内の異なる要素の数。
  • アルゴリズムのあなたの時間の複雑さがなければなりません良くOよりも(N-ログN-、)  N- 配列サイズ。

基本的な考え方:

そして、ハッシュマップレコードを持つ各要素の出現回数。

次に、プライオリティキュー記憶素子、及び、大きなフロントkを見つけます。

ACコード:

struct Pair{
  int a;
  int b;
  
  Pair(int _a, int _b) :
    a(_a), b(_b) {}
  
  bool operator<(const Pair &x) const {
    return b > x.b;
  }

  bool operator>(const Pair &y) const {
    return !(*this < y);
  }
};

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
      // 统计各个元素以及其对应的次数
      map<int, int> hashmap;
      for (int num : nums) {
        ++hashmap[num];
      }
      // 创建优先队列返回前k大的元素
      priority_queue<Pair, vector<Pair>, greater<Pair>> q;
      for (auto it = hashmap.begin(); it != hashmap.end(); ++it) {
        Pair p(it->first, it->second); 
        q.push(p);
      }
      vector<int> res;
      for (int i = 0; i < k; ++i) {
        res.push_back(q.top().a);
        q.pop();
      }
      return res;
    }
};

その他の経験:

この質問は、実際には1日の午後には、理由がC ++のSTLに精通しているだけでは十分ではない、ここで遭遇した壁をまとめました:

  1. PRIORITY_QUEUEは、2つのテンプレートを受け入れ、一つは直接に似たようなものがあり、要素の型を受け入れるがあり、<int型、ベクトル<整数>大きい<int型>> そうで。
  2. 1前だけint型の場合であるPRIORITY_QUEUE要素について言及しました。関連するすべての種類を変更することがint型でない場合は、int型の必要性
  3. このアルゴリズムの一部は、ラムダの機能を使用することができますが、それは、テンプレートを持たなければならないため、上記の、最初のより一層の活用をlamdba、することはできません、別の理由が大きいが、実際にファンクタである-それは実際には、関数のように見えます、クラス
  4. カスタム型の場合は、クラスによって過負荷にすることができ、<と>、およびテンプレートの種類を指定します。(本又はパラメータはconst型でなければならなかったかどうか注)
  5. 私たちのペアの種類は、様々な比較演算子を定義されているアップ。これは、比較する辞書の順序に従っています。あなたの比較ペアは非メンバ関数でオーバーロードできません。
  6. 最後に、ペアタイプを有効にするために、私の定義に従って比較することができ、私は新しいタイプを再定義オーバーロードし、<と>、その後、私はテンプレートにこの新しい型定義渡さ-コードを参照。
公開された137元の記事 ウォン称賛19 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_43338695/article/details/102758327