Description
Solution
经典问题,用一个大根堆和一个小根堆来维护数据流的中位数,稍微手推一下即可
Hint
priority_queue<int,vector<int>,greater<int> >q2;//小根堆
priority_queue<int,vector<int>,less<int> >q1;//大根堆
Code
class MedianFinder {
public:
/** initialize your data structure here. */
priority_queue<int,vector<int>,greater<int> >q2;//小根堆
priority_queue<int,vector<int>,less<int> >q1;//大根堆
MedianFinder() {
while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
}
void addNum(int num) {
int sz1 = q1.size(), sz2 = q2.size();
if(sz1 == sz2) {
if(sz1 == 0) q1.push(num);
else {
int z = q1.top();
if(num >= z) q2.push(num);
else q1.push(num);
}
} else if(sz1 < sz2) {
int y = q2.top();
if(num <= y) q1.push(num);
else q1.push(y), q2.pop(), q2.push(num);
} else if(sz1 > sz2) {
int z = q1.top();
if(num >= z) q2.push(num);
else q2.push(z), q1.pop(), q1.push(num);
}//cout << num << " " << q1.size() << " " << q2.size() << endl;
}
double findMedian() {
int sz1 = q1.size(), sz2 = q2.size();
double res = 0.0;
if(sz1 == sz2) {
res = (1.0*q1.top() + q2.top()) / 2.0;
} else if(sz1 < sz2) {
res = (double)q2.top();
} else if(sz1 > sz2) {
res = (double)q1.top();
}return res;
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/