LeetCode今日の1つの質問-2.11-1423-利用可能な最大ポイントC ++

タイトル説明

ここに画像の説明を挿入します

小さなルートヒープを解決して、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)

おすすめ

転載: blog.csdn.net/qq_42883222/article/details/113880813