var MedianFinder = function () {
this.maxHeap = new PriorityQueue((a, b) => a - b);
this.minHeap = new PriorityQueue((a, b) => b - a);
};
/**
* @param {number} num
* @return {void}
*/
MedianFinder.prototype.addNum = function (num) {
// 我们的目标就是建立两个堆,一个大顶堆,一个小顶堆
// 结合中位数的特点
// 这两个堆需要满足:
// 1. 大顶堆元素都比小顶堆小(由于堆的特点其实只要比较堆顶即可)
// 2. 大顶堆元素不小于小顶堆,且最多比小顶堆多一个元素
// 满足上面两个条件的话,如果想要找到中位数,就比较简单了
// 如果两个堆数量相等(本质是总数为偶数), 就两个堆顶元素的平均数
// 如果两个堆数量不相等(本质是总数为奇数), 就取大顶堆的堆顶元素
// 问题如果保证满足上述两个特点
// 1. 保证第一点
this.maxHeap.enq(num);
// 由于小顶堆的所有数都来自大顶堆的堆顶元素(最大值)
// 因此可以保证第一点
this.minHeap.enq(this.maxHeap.deq());
// 2. 保证第二点
if (this.maxHeap.size() < this.minHeap.size()) {
this.maxHeap.enq(this.minHeap.deq());
}
};
/**
* @return {number}
*/
MedianFinder.prototype.findMedian = function () {
if (this.maxHeap.size() == this.minHeap.size())
return (this.maxHeap.peek() + this.minHeap.peek()) / 2.0;
else return this.maxHeap.peek();
};
/**
* Your MedianFinder object will be instantiated and called as such:
* var obj = new MedianFinder()
* obj.addNum(num)
* var param_2 = obj.findMedian()
*/