要求:rt,要动态插入
思路:大根堆保留小的一半,小根堆保留大的一半。奇数那个放在大根堆。插入元素时,先插小根堆,如果此时两边个数相等,则把小根堆顶根大根堆顶比较交换;如果小根堆多了一个那直接把小根堆顶插进大根堆
class MedianFinder {
public:
/** initialize your data structure here. */
priority_queue<int,vector<int>,less<int>> maxheap;
priority_queue<int,vector<int>,greater<int>> minheap;
MedianFinder() {
}
void addNum(int num) {
minheap.push(num);
if(minheap.size()==maxheap.size()){
if(maxheap.top()>minheap.top()){
int m=maxheap.top();
maxheap.pop();
int n=minheap.top();
minheap.pop();
maxheap.push(n);
minheap.push(m);
}
}
else {
maxheap.push(minheap.top());
minheap.pop();
}
}
double findMedian() {
if(minheap.size()==maxheap.size())return (minheap.top()+maxheap.top())/2.0;
else return maxheap.top();
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/