中央値は、順序付けられた整数リストの中央値です。リストのサイズが偶数の場合は、中間の値ではありません。だから、中央値は、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
ファローアップ:
- ストリームからのすべての整数値が0と100の間であれば、どのようにそれを最適化するのでしょうか?
- ストリームからのすべての整数の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 。 } } }