Likou 703データストリームのK番目に大きい要素(マルチセット法)

元のタイトル:703。データストリームでK番目に大きい要素

 

データストリーム内でk番目に大きい要素を見つけるクラスを設計します。これは、ソート後のk番目に大きい要素であり、k番目に異なる要素ではないことに注意してください。

KthLargestクラスを実装してください。

KthLargest(int k、int [] nums)は、整数kと整数ストリームnumsを使用してオブジェクトを初期化します。
int add(int val)valをデータストリームnumsに挿入した後、現在のデータストリームでk番目に大きい要素を返します。
 

例:

輸出入:
["KthLargest"、 "add"、 "add"、 "add"、 "add"、 "add"]
[[3、[ 4、5、8、2 ]]、[3]、[5]、 [10]、[9]、[4]]
エクスポート:
[null、4、5、5、8、8 ]

解释:
KthLargest kthLargest = new KthLargest(3、[4、5、8、2]);
kthLargest.add(3); // 4
kthLargest.add(5);を返します // 5
kthLargest.add(10);を返します // 5
kthLargest.add(9);を返します // 8
kthLargest.add(4);を返します // 8を返します
 

プロンプト:
1 <= k <= 104
0 <= nums.length <= 104
-104 <= nums [i] <= 104
-104 <= val <= 104add
メソッドは最大104回呼び出すことができます
。kの場合大きな要素の場合、配列には少なくともk個の要素があります

 

        明らかに、データストリーム内でk番目に大きい要素を見つけるには並べ替えが必要です。データ構造を使用しない場合は、最初に最初の入力数値を並べ替え、次に位置を見つけた後に挿入されたデータを数値に挿入しますが、実装が遅く、効果はあまり客観的ではありません。ここでは、マルチセットの特性を使用できます。つまり、任意の順序で挿入されたマルチセットは常に順番(小さいものから大きいものへ)であり、4、5、8、2を挿入するなど、番号を繰り返すことができます。多重集合内の順序。2、4、5、および8であるため、手動の初期ソートとその後の挿入ソートの時間を節約できます。k番目に大きい要素を出力したいので、この多重集合のサイズをkに制御できます。データの挿入後に多重集合のサイズがkを超えると、多重集合の最初の要素を削除すると、サイズの制御が実現します。 kの、そして今この多重集合のサイズk要素は入力データストリームの最大のkです。

        したがって、KthLargestでは、最初のnumがマリセットに順次挿入され、サイズがkを超えると、最初の要素が削除されます。同様に、addで、最初にvalを挿入し、kより大きい場合は、最初の要素を削除します(おそらく、初期データストリームサイズがkより小さいため、削除する前に判断する必要があります。そうでない場合、マルチセットのサイズは常にk未満です。 )、次に戻ります最初の要素を削除するだけです。add関数でサイズkを知る必要がありますが、指定された入力パラメーターでは知る必要がないため、kの値を保存するためにグローバル変数kkが定義されています。

class KthLargest {
    multiset <int> topk;
    int kk;
public:
    KthLargest(int k, vector<int>& nums) {
        kk=k;
        for(int i=0;i<nums.size();i++){
            topk.insert(nums[i]);
            if(topk.size()>k)
                topk.erase(topk.begin());
        }
    }
    
    int add(int val) {
        topk.insert(val);
        if(topk.size()>kk)
            topk.erase(topk.begin());
        return *topk.begin();
    }
};

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest* obj = new KthLargest(k, nums);
 * int param_1 = obj->add(val);
 */

 

おすすめ

転載: blog.csdn.net/qq_36614557/article/details/114263559