class MedianFinder {
public:
/** initialize your data structure here. */
MedianFinder() {
}
void addNum(int num) {
if(a.empty()){
a.push(num);
return;
}
if(a.size()==b.size()){
if (num<b.top()){
b.push(num);
}else{
a.push(num);
}
}else if(a.size()>b.size()){
if (b.size()>0&&num<b.top()){
b.push(num);
}else{
if (a.size()>0&&num<=a.top()){
b.push(num);
}else{
b.push(a.top());
a.pop();
a.push(num);
}
}
}else{
if (num>a.top()){
a.push(num);
}else{
if (num>=b.top()){
a.push(num);
}else {
a.push(b.top());
b.pop();
b.push(num);
}
}
}
}
double findMedian() {
if (b.size()>a.size()){
return b.top();
}else if (b.size()<a.size()){
return a.top();
}else{
return (a.top()+b.top())/2.0;
}
}
private:
priority_queue<int ,vector<int >,greater<int>> a;
priority_queue<int ,vector<int >,less<int>> b;
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/
建两个堆,在addnum()函数中应满足,1.大堆的堆顶小于小堆的堆顶。
2.大堆和小堆的元素个数差一;
在findmedian()函数中赢满足,1.当两堆的大小相等时,取两堆的堆顶的平均数。
2.当两堆的大小不相等时,取元素较多的堆的堆顶。