LeetCode295 資料流的中位數(C )

2021-09-19 04:12:35 字數 1395 閱讀 3720

題目描述

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

例如,[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 返...