这道题目的思路就是使用两个优先队列,大顶堆和小顶堆,前者放数据流前半部分,后者放后半部分数据,这样他们的堆顶必定是中位数,greater是默认的大顶堆,这里有一点注意,每次插入到一个堆时要先插入另一个堆,返回他的堆顶再重新插入,这样保证每次插入的是大顶堆的最大值,或者小顶堆的最小值
class MedianFinder {
public:
/** initialize your data structure here. */
priority_queue<int,vector<int>,greater<int>> big;
priority_queue<int,vector<int>,less<int>> small;
MedianFinder() {
}
void addNum(int num) {
if(small.size()<big.size())
{
big.push(num);
small.push(big.top());
big.pop();
}
else
{
small.push(num);
big.push(small.top());
small.pop();
}
}
double findMedian() {
if((small.size()+big.size())%2==0)
{
return (small.top()+big.top())/2.0;
}
else{
return big.top();
}
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/