LeetCode-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

ファローアップ:

  1. ストリームからのすべての整数値が0と100の間であれば、どのようにそれを最適化するのでしょうか?
  2. ストリームからのすべての整数の99%が0と100の間であれば、どのようにそれを最適化するのでしょうか?
クラスMedianFinder { 

    int型数えます。
    優先度つきキュー <整数> のminheap。
    優先度つきキュー <整数> maxHeap。
    / ** ここにあなたのデータ構造を初期化します。* / 
    パブリックMedianFinder(){ 
        カウント = 0 ; 
        minheap = 新しい優先度つきキュー<> (); 
        maxHeap = 新しい優先度つきキュー<>(新しいコンパレータ<整数> (){
             公共 のint (整数O1、O2整数)を比較{
                 戻り O 2  O1と、
            }
        }); 
    } 
    
    公共 ボイド addNum(int型NUM){
         もし、((カウント&1)== 0 ){ 
            maxHeap.offer(NUM)。
            INT、N = maxHeap.poll()。
            minHeap.offer(N)
        } 
        { 
            minHeap.offer(NUM)。
            INT、N = minHeap.poll()。
            maxHeap.offer(N)
        } 
        カウント ++ ; 
    } 
    
    公共 ダブルfindMedian(){
         場合(== 0をカウント){
             戻り 0.0; 
        } 
        もし、((カウント&1)== 0 ){
             リターン(minHeap.peek()+ maxHeap.peek())/ 2.0 
        } 
        {
             戻り minHeap.peek()* 1.0 
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/zhacai/p/11204420.html