題目描述
中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。
例如,[2,3,4] 的中位數是 3
[2,3] 的中位數是 (2 + 3) / 2 = 2.5
設計乙個支援以下兩種操作的資料結構:
示例:
addnum(1)解題思路:動態維護乙個最大堆和乙個最小堆,最大堆儲存一半元素最小堆儲存一半元素,維持最大堆的堆頂比最小堆的堆頂小。addnum(2)
findmedian() -> 1.5
addnum(3)
findmedian() -> 2
1.當最大堆與最小堆元素個數相同時,新元素小於最大堆,就push進最大堆,反之則入最小堆。
2.當最大堆比最小堆多乙個元素:
(1)如果新元素小於最大堆堆頂:經最大堆的堆頂push進入最小堆,將最大堆的堆頂移除,將新元素新增到最大堆。
(2)如果新元素大與最大堆堆頂,竟新元素直接push到最小堆。
3.當最大堆比最小堆少乙個元素:
(1)如果新元素小於最小堆的堆頂,將新元素直接push進入最大堆。
(2)如果新元素大與最小堆堆頂,將最小堆的堆頂push進入最大堆,將最小堆的堆頂一出,將新元素新增至最小堆。
4.最後獲取中位數。
(1)最大堆最小堆中的元素個數相同時,中位數是最大堆堆頂與最小堆堆頂的平均值。
(2)最大堆比最小堆多乙個元素時,中位數是最大堆的堆頂。
(3)最大堆比最小堆少乙個元素,中位數是最小堆堆頂。
下面是我的**,因為思路寫的已經很全所以麼有些注釋,其實就是按照思路一步一步走就可以了。
class medianfinder
void addnum(int num)
if(big_heap.size()==small_heap.size())else
}else if(big_heap.size()>small_heap.size())else
}else if(big_heap.size()small_heap.size())else
}private:
priority_queue,less> big_heap;
priority_queue,greater> small_heap;
};/**
* 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 返...