leetcode 295 資料流的中位數

2021-10-05 23:54:37 字數 1145 閱讀 4011

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

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

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

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

void addnum(int num) - 從資料流中新增乙個整數到資料結構中。

double findmedian() - 返回目前所有元素的中位數。

示例:addnum(1)

addnum(2)

findmedian() -> 1.5

addnum(3)

findmedian() -> 2

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

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

思路:使用兩個堆,乙個最大堆乙個最小堆,分別儲存一半的元素,當要時刻保持最小堆的堆頂元素大於最大堆的堆頂元素,這樣中值就一定在兩個堆頂其中之一。步驟如下:

插入元素的時候,判斷插入的元素是否大於最小堆的堆頂,若大於最小堆的堆頂,則說明當前元素是較大的一半元素中的乙個,因此壓入最小堆,反之則壓入最大堆。之後堆兩個堆的大小進行平衡,使得大小差值小於等於1,平衡的方法是將較多元素的堆頂壓入較少元素的堆中。

在返回中位數的時候,返回數量較多的堆的堆頂,當數量一樣時,返回兩個堆頂的平均值。

class

medianfinder

void

addnum

(int num)

else

else}if

(minlen-

1>maxlen)

else

if(maxlen-

1>minlen)

}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 設計乙個支援以下兩種操作的資料結構 示例 addnum 1 addnum 2 findmedian 1.5 addnum 3 findmedian 2...

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 返...