以下の問題を解決するためにここでminヒープを使用する方法を知りたいと思います。これを解決するためにminヒープを使用する方法
私が解決すると考えたことは、ハッシュテーブルを使用して数値の数を保存することです。しかし、問題を解決するために最小のヒープをどのように使用するのか分かりません。
整数の空でない配列が与えられた場合、k個の最も頻繁な要素を返します。
たとえば、 [1,1,1,2,2,3]とk = 2の場合、[1,2]を返します。
注:kは常に有効です.1≦k≦固有数です。 アルゴリズムの時間の複雑さは、O(n log n)よりも優れている必要があります.nは配列のサイズです。
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> counts;
priority_queue<int, vector<int>, greater<int>> max_k;
for(auto i : nums) ++counts[i];
for(auto & i : counts) {
max_k.push(i.second);
// Size of the min heap is maintained at equal to or below k
while(max_k.size() > k) max_k.pop();
}
vector<int> res;
for(auto & i : counts) {
if(i.second >= max_k.top()) res.push_back(i.first);
}
return res;
}
投稿したコードは機能しますか?もしそうなら、それです - 'std :: priority_queue'は最小ヒープです。 – Quentin
@Quentin私はデータ構造の初心者です。ヒープを使用して上位のK要素を取得する方法を説明できますか? –
私にはあなたの質問は不明です。あなたは、コードの作業を取得するか、コードの仕組みを尋ねていますか? – 4386427