LeetCode 295 資料流的中位數

2021-09-19 13:13:47 字數 1016 閱讀 5779

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

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

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

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

示例:

addnum(1)

addnum(2)

findmedian() -> 1.5

addnum(3)

findmedian() -> 2

高階:

如果資料流中所有整數都在 0 到 100 範圍內,你將如何優化你的演算法?

如果資料流中 99% 的整數都在 0 到 100 範圍內,你將如何優化你的演算法?

建立乙個小頂堆和乙個大頂堆,小頂堆儲存比較大的那一半數,大頂堆儲存比較小的那一半數,整個過程中都保證小頂堆的元素數量等於大頂堆的元素數量,或小頂堆比大頂堆多乙個元素。當新增數時,先加到小頂堆裡,然後將小頂堆的堆頂元素彈出加入到大頂堆裡,這樣就保證了新增數後,小頂堆中的數仍比大頂堆中的數大。然後判斷如果小頂堆的元素數量小於大頂堆的元素數量,就把大頂堆的堆頂元素彈出加入到小頂堆中,這樣就保證了小頂堆的元素數量大於等於大頂堆的元素數量。當要返回中位數時,判斷如果大頂堆和小頂堆的元素數量相同,那麼返回兩個堆頂的平均值;如果小頂堆比大頂堆多乙個元素,那麼返回小頂堆的堆頂元素就是中位數。

class medianfinder 

void addnum(int num)

}double findmedian()

};/**

* your medianfinder object will be instantiated and called as such:

* medianfinder* obj = new medianfinder();

* obj->addnum(num);

* double param_2 = obj->findmedian();

*/

LeetCode 295 資料流的中位數

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 void addnum int num 從資料流中新增乙個整數到資料結構中。double findmedian 返...

LeetCode 295 資料流的中位數

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 void addnum int num 從資料流中新增乙個整數到資料結構中。double findmedian 返...

leetcode 295 資料流的中位數

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 void addnum int num 從資料流中新增乙個整數到資料結構中。double findmedian 返...