用一个大根堆和一个小根堆动态维护,并且①大根堆最大数字小于小根堆最小②小根堆大小+1>=大根堆的大小>=小根堆的大小
那么当添加一个数字的时候只需考虑,如何改变队列而不影响上面两个条件,有两种情况:
①当前两个队列大小相等,那么要将小根堆中的数字和当前 数字里最小的插入大根堆。
②不等,则相反。
class MedianFinder {
priority_queue<int>p;
priority_queue<int,vector<int>,greater<int>>q;
public:
/** initialize your data structure here. */
MedianFinder() {
while(!p.empty()) p.pop();
while(!q.empty()) q.pop();
}
void addNum(int num) {
if(p.size()==q.size()) {
q.push(num);
p.push(q.top());
q.pop();
}
else {
p.push(num);
q.push(p.top());
p.pop();
}
}
double findMedian() {
int n=q.size()+p.size();
if(n&1) return p.top();
return 1.0*(p.top()+q.top())/2;
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/