元のタイトル: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);
*/