描述
如何得到一個數據流中的中位數?如果從數據流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從數據流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。
分析
插入有兩種思路:
1. 直接插入大堆中,之後若兩堆尺寸之差大於1(也就是2),則從大堆中彈出堆頂元素並插入到小堆中,若兩隊之差不大於1,則直接插入大堆中即可。
2. 奇數個數插入到大堆中,偶數個數插入到小堆中,但是 可能會出現當前待插入的數比小堆堆頂元素大,此時需要將元素先插入到小堆,然後將小堆堆頂元素彈出並插入到大堆中對於偶數時插入小堆的情況,一樣的道理。why?因爲要保證最大堆的元素要比最小堆的元素都要小。
Code
#include <bits/stdc++.h>
using namespace std;
class Solution {
private:
priority_queue<int, vector<int>, less<int> > p;
priority_queue<int, vector<int>, greater<int> > q;
public:
void Insert(int num){
if(p.empty() || num <= p.top()) p.push(num);
else q.push(num);
if(p.size() == q.size() + 2) q.push(p.top()), p.pop();
if(p.size() + 1 == q.size()) p.push(q.top()), q.pop();
}
double GetMedian(){
return p.size() == q.size() ? (p.top() + q.top()) / 2.0 : p.top();
}
};
int main()
{
Solution tmp;
tmp.Insert(1);
tmp.Insert(5);
tmp.Insert(2);
tmp.Insert(3);
tmp.Insert(4);
cout<<tmp.GetMedian()<<endl;
return 0;
}