問題の説明:
非ヌル整数配列、最初の戻りの発生頻度所与 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に精通しているだけでは十分ではない、ここで遭遇した壁をまとめました:
- PRIORITY_QUEUEは、2つのテンプレートを受け入れ、一つは直接に似たようなものがあり、要素の型を受け入れるがあり、<int型、ベクトル<整数>大きい<int型>> そうで。
- 1前だけint型の場合であるPRIORITY_QUEUE要素について言及しました。関連するすべての種類を変更することがint型でない場合は、int型の必要性。
- このアルゴリズムの一部は、ラムダの機能を使用することができますが、それは、テンプレートを持たなければならないため、上記の、最初のより一層の活用をlamdba、することはできません、別の理由が大きいが、実際にファンクタである-それは実際には、関数のように見えます、クラス。
- カスタム型の場合は、クラスによって過負荷にすることができ、<と>、およびテンプレートの種類を指定します。(本又はパラメータはconst型でなければならなかったかどうか注)
- 私たちのペアの種類は、様々な比較演算子を定義されているアップ。これは、比較する辞書の順序に従っています。あなたの比較ペアは非メンバ関数でオーバーロードできません。
- 最後に、ペアタイプを有効にするために、私の定義に従って比較することができ、私は新しいタイプを再定義オーバーロードし、<と>、その後、私はテンプレートにこの新しい型定義渡さ-コードを参照。