利用最大堆和最小堆,
始终保持两个堆的大小最多只相差1,
如果大小相等,则中位数是两个堆根节点的平均数,
否则就是较多的那个堆的根节点。
当最大堆比较多,
如果是大的数,则直接加入最小堆,
如果是小的数,则将最大堆的根节点移到最小堆,令最小堆更多,将小的数加入最大堆
反之同理
class MedianFinder {
priority_queue<double> maxHeap;//最大堆
priority_queue<double,vector<double>,greater<double>> minHeap;//最小堆
public:
/** initialize your data structure here. */
MedianFinder() {
}
void addNum(int num) {
//为空时,随便加入哪个堆
if(maxHeap.empty()){
maxHeap.push(num);
return;
}
//大小相等时,小的数加入最大堆,大的数加入最小堆
if(maxHeap.size() == minHeap.size()){
if(num < maxHeap.top())
maxHeap.push(num);
else
minHeap.push(num);
//最大堆比较多,如果是大的数,则直接加入最小堆
//否则将最大堆的根节点移到最小堆,令最小堆更多,将小的数加入最大堆
//反之同理
}else if(maxHeap.size() > minHeap.size()){
if(num > maxHeap.top())
minHeap.push(num);
else{
minHeap.push(maxHeap.top());
maxHeap.pop();
maxHeap.push(num);
}
}else{
if(num < minHeap.top())
maxHeap.push(num);
else{
maxHeap.push(minHeap.top());
minHeap.pop();
minHeap.push(num);
}
}
}
double findMedian() {
if(maxHeap.size() == minHeap.size())
return (maxHeap.top()+minHeap.top())/2;
else if(maxHeap.size() > minHeap.size())
return maxHeap.top();
else
return minHeap.top();
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/