295 資料流的中位數

2021-09-14 02:03:19 字數 1125 閱讀 2914

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

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

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

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

示例:

addnum(1)

addnum(2)

findmedian() -> 1.5

addnum(3)

findmedian() -> 2

解題思路:需要中位數,我們考慮用兩個優先順序對立列,將資料流中的數進行分成兩半,一般為資料流中偏小數,一半為資料流中偏大的數 比如 資料流為  1 6 8 5 4 9  那麼分成的兩半就為 1 4  5   和 6 8  9  將偏小的這一段放在乙個大根堆,選出最大的值(5) ,偏大的一段放在小根堆,選出最小值(6),這裡大根堆和小根堆裡面的數目相同,中位數就是(5+6)/2 ,我們在實現的過程中,始終讓大根堆的元素個數大於小根堆,這樣,如果資料流中是單數的話,就可以直接取出小根堆的值了

具體為 先放大根堆,如果大根堆個數比小根堆的個數超過2,就將大根堆的頂值扔到小根堆;如果個數不超過2,就看大根堆的頂值是否大於小根堆的頂值,如果大於,就交換兩個堆的頂值

**實現為

class medianfinder 

void addnum(int num)

if(small.size()>0&&big.top()>small.top())

} double findmedian()

private:

priority_queue, greater> small;

priority_queuebig;

};/**

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

* medianfinder obj = new medianfinder();

* obj.addnum(num);

* double param_2 = obj.findmedian();

*/

295 資料流的中位數

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

295 資料流的中位數

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

295 資料流的中位數 C

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