タイトル説明
小さなルートヒープを解決して、TOPKの問題を解決します
小さな根の山はTOPKのアイデアを解決します:
最小値を見つける
最初に大きなルートパイルを作成し、次にk個の数字を押します
。残りの各数字を最初に押して
から、パイルの一番上の要素をポップします。すべての要素を押した後、パイルの一番上はk番目に小さい数字になります。 。
最大値を見つける
最初に小さなルートヒープを作成し、次にk個の数字を押します
。残りの各数字を最初に押して
から、ヒープの一番上の要素をポップします。すべての要素を押した後、ヒープの一番上がk番目に大きい数字になります。
ps:C ++のデフォルトはビッグルートヒープです。ここでは、ビッグルートとスモールルートの表現を覚えています。
- 少し大きい
-
priority_queue<int, vector<int>, greater<int>> q;
- 大根less
-
priority_queue<int, vector<int>, less<int>> q;
class KthLargest {
public:
//小根堆 堆首取第k大元素
priority_queue<int, vector<int>, greater<int>> q;
int k;
KthLargest(int k, vector<int>& nums) {
this -> k = k;
this -> q = priority_queue<int, vector<int>, greater<int>> (nums.begin(), nums.end());
}
int add(int val) {
q.push(val);
if(q.size() < k) return NULL;
while(q.size() > k) {
q.pop();
}
return q.top();
}
};
/**
* Your KthLargest object will be instantiated and called as such:
* KthLargest* obj = new KthLargest(k, nums);
* int param_1 = obj->add(val);
*/
時間計算量O(1)追加関数の平均計算量
空間計算量O(n)