思路:大顶堆和小顶堆
code
class MedianFinder {
public:
priority_queue<int>q_down;
priority_queue<int,vector<int>, greater<int>>q_up;
MedianFinder() {
}
void addNum(int num) {
if (q_down.empty()) q_down.push(num);
else {
int down = q_down.top();
if (num <= down) {
if (q_down.size() == q_up.size()) q_down.push(num);
else {
q_up.push(down);
q_down.pop();
q_down.push(num);
}
}
else {
if (q_up.size() < q_down.size()) q_up.push(num);
else {
if (num <= q_up.top()) q_down.push(num);
else {
q_down.push(q_up.top());
q_up.pop();
q_up.push(num);
}
}
}
}
}
double findMedian() {
if ((q_up.size() + q_down.size()) % 2) return q_down.top();
else {
double a = q_down.top(), b = q_up.top();
return (a + b) / 2;
}
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/