中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。
例如,[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 返...