[LC]データストリームから295検索の中央値

中央値は、順序付けられた整数リストの中央値です。リストのサイズが偶数の場合は、中間の値ではありません。だから、中央値は、2つの中間値の平均値です。

例えば、

[2,3,4]、中央値は、 3

[2,3]、中央値は、 (2 + 3) / 2 = 2.5

以下の2つの操作をサポートするデータ構造を設計します。

  • 無効addNum(int型NUM) - データストリームからのデータ構造に整数値を追加します。
  • ダブルfindMedian() - 戻り、これまでのすべての要素の中央値。

 

例:

addNum(1)
addNum(2)
findMedian() - > 1.5 
addNum(3)
findMedian() - > 2

クラスMedianFinder { 

    プライベート優先度つきキュー<整数> smallPq。
    プライベート優先度つきキュー<整数> largePq。
    / ** ここにあなたのデータ構造を初期化します。* / 
    パブリックMedianFinder(){
         // smallPqがpeek()の最大値を取得 
        smallPq = 新しい優先度つきキュー<>((a、b)は- >(B - )); 
        largePq = 新しい優先度つきキュー<> (); 
    } 
    
    公共 ボイド addNum(INT NUM){
         場合(smallPq.isEmpty()|| NUM <= smallPq.peek()){
            smallPq.offer(NUM)。
        } { 
            largePq.offer(NUM)。
        } 
        
        であれば(smallPq.size()> = largePq.size()+ 2 ){ 
            largePq.offer(smallPq.poll())。
        } そう であれば(largePq.size()> smallPq.size()){ 
            smallPq.offer(largePq.poll())。
        } 
    } 
    
    公共 ダブルfindMedian(){
         場合(smallPq.size()== largePq.size()){
             リターン(smallPq.peek()+ largePq.peek())/ 2.0 
        } {
             リターンダブル)(smallPq.peek())。
        } 
    } 
} 

/ ** 
 *あなたのMedianFinderオブジェクトインスタンス化し、そのように呼ばれます:
 * MedianFinder OBJ =新しいMedianFinder(); 
 * obj.addNum(NUM); 
 *ダブルPARAM_2 = obj.findMedian(); 
 * /

 

おすすめ

転載: www.cnblogs.com/xuanlu/p/12015397.html