流式数据,不断有数据进来,维护两个堆,一个大顶堆,一个小顶堆。下面大定堆,上面是小顶堆,当大顶堆元素始小于等于小顶堆元素加1。
可以很容易知道,如果当前数据流总数为偶数,答案就是堆顶元素之和/2
如果为奇数,答案就是大顶堆元素。
在插入过程中,先看是插在下面还是上面,然后再动态调整。
class MedianFinder {
public:
/** initialize your data structure here. */
priority_queue<int,vector<int>,greater<int>> up; // 小根堆
priority_queue<int> down; // 大根堆
MedianFinder() {
}
void addNum(int num) {
if(down.empty()||num<down.top()) down.push(num);
else up.push(num);
if(down.size()>up.size()+1){
int tmp = down.top();
down.pop();
up.push(tmp);
}
if(up.size()>down.size()){
int tmp = up.top();
up.pop();
down.push(tmp);
}
}
double findMedian() {
if((up.size()+down.size())%2) return down.top();
else return (up.top()+down.top())/2.0;
}
};