Javascript (ES6)
class RunningMedian {
minHeap = new MinHeap();
maxHeap = new MaxHeap();
add = (val) => {
maxHeap.add(val);
minHeap.add(maxHeap.poll());
if (maxHeap.size() < minHeap.size()) {
maxHeap.add(minHeap.poll());
}
};
median = () => {
if (maxHeap.size() > minHeap.size()) {
return maxHeap.peek();
}
return (minHeap.peek() + maxHeap.peek()) / 2;
};
}
Java
class MedianFinder {
public PriorityQueue < Integer > maxHeap;
public PriorityQueue < Integer > minHeap;
/** initialize your data structure here. */
public MedianFinder() {
this.maxHeap = new PriorityQueue < > (Collections.reverseOrder());
this.minHeap = new PriorityQueue < > ();
}
public void addNum(int num) {
this.maxHeap.add(num);
this.minHeap.add(this.maxHeap.remove());
if (this.maxHeap.size() < this.minHeap.size()) {
this.maxHeap.add(this.minHeap.remove());
}
}
public double findMedian() {
return this.maxHeap.size() > this.minHeap.size() ? this.maxHeap.peek() * 1.0 : (this.maxHeap.peek() + this.minHeap.peek()) * 0.5;
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/