資料流的中位數(優先佇列解決)

2021-10-04 07:36:06 字數 1297 閱讀 9178

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。

例如,[2,3,4] 的中位數是 3

[2,3] 的中位數是 (2 + 3) / 2 = 2.5

設計乙個支援以下兩種操作的資料結構:

示例

addnum(1)

addnum(2)

findmedian() -> 1.5

addnum(3)

findmedian() -> 2

通過兩個優先佇列對數字進行push。

需要讓兩個棧始終滿足兩個條件

根據兩個佇列的size進行分別處理,再對數字進行分類push處理

//最大堆,從大到小

priority_queue<

int,vector<

int>

,greater<

int>

> small_queue;

//最小堆,從小到大

void

addnum

(int num)

if(big_queue.

size()

>small_queue.

size()

)//最大堆比最小堆多

else

}else

if(big_queue.

size()

== small_queue.

size()

)//個數相等時

else

}else

//最大堆比最小堆少乙個

else}}

double

findmedian()

else

if(big_queue.

size()

> small_queue.

size()

)return small_queue.

top();

}};int

main()

;for

(int i=

0;i<

4;i++

)}

優先佇列(一)資料流中的中位數

對應 leetcode 295 資料流中的中位數 設計乙個支援如下兩種操作的資料結構 由於這裡無法確切知道資料元素的規模,因此一般通過列表的方式儲存元素再求取中位數的方式不是特別可靠。考慮使用 堆 資料結構來完成這個功能,維護兩個堆 最大堆和最小堆,最大堆用於儲存中位數元素以下的所有元素,最小堆儲存...

資料流的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。coding utf ...

資料流的中位數

資料流的中位數 中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例 addnum 1 addnum 2 findmedian 1.5 addnum 3 find...