295. Find Median from Data Stream
addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)
findMedian() -> 2class MedianFinder {
public:
/** initialize your data structure here. */
MedianFinder() {
}
void addNum(int num) { // time: O(logn)
if (maxHeap.empty() || maxHeap.top() > num)
maxHeap.push(num);
else
minHeap.push(num);
if (maxHeap.size() > minHeap.size() + 1) {
minHeap.push(maxHeap.top());
maxHeap.pop();
} else if (minHeap.size() > maxHeap.size() + 1) {
maxHeap.push(minHeap.top());
minHeap.pop();
}
}
double findMedian() { // time: O(1)
if (maxHeap.size() == minHeap.size())
return maxHeap.empty() ? 0 : (maxHeap.top() + minHeap.top()) / 2.0;
else {
return maxHeap.size() > minHeap.size() ? maxHeap.top() : minHeap.top();
}
}
private:
priority_queue<int> maxHeap;
priority_queue<int, vector<int>, greater<int> > minHeap;
};
Last updated