中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。
例如,[2,3,4] 的中位數是 3
[2,3] 的中位數是 (2 + 3) / 2 = 2.5
設計乙個支援以下兩種操作的資料結構:
示例:
解題思路:需要中位數,我們考慮用兩個優先順序對立列,將資料流中的數進行分成兩半,一般為資料流中偏小數,一半為資料流中偏大的數 比如 資料流為 1 6 8 5 4 9 那麼分成的兩半就為 1 4 5 和 6 8 9 將偏小的這一段放在乙個大根堆,選出最大的值(5) ,偏大的一段放在小根堆,選出最小值(6),這裡大根堆和小根堆裡面的數目相同,中位數就是(5+6)/2 ,我們在實現的過程中,始終讓大根堆的元素個數大於小根堆,這樣,如果資料流中是單數的話,就可以直接取出小根堆的值了addnum(1)addnum(2)
findmedian() -> 1.5
addnum(3)
findmedian() -> 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 返...