数据流中的中位数
思路
维护两个优先队列,为了达到查找效率为 O ( 1 ) O(1) O(1)的时间复杂度,将中位数位于某一个堆的对顶,所以较小堆采用大顶堆,两一个使用小根堆,小根堆的数的个数可以比大根堆多1,如果说新加入的数小于等于小根堆,就加入小根堆中
class MedianFinder {
public:
priority_queue<int, vector<int>, less<int>> q1;
priority_queue<int, vector<int>, greater<int>> q2;
MedianFinder() {}
void addNum(int num) {
if (q1.empty() || num <= q1.top()) {
q1.push(num);
if (q2.size() + 1 < q1.size()) {
q2.push(q1.top());
q1.pop();
}
} else {
q2.push(num);
if (q2.size() > q1.size()) {
q1.push(q2.top());
q2.pop();
}
}
}
double findMedian() {
if (q1.size() > q2.size()) {
return q1.top();
}
return (q1.top() + q2.top()) / 2.0;
}
};