中央値は、順序付けられた整数リストの中央値です。リストのサイズが偶数の場合は、中間の値ではありません。だから、中央値は、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(); * /