题目链接:面试题41. 数据流的中位数
基本思想:使用一个最小堆minHeap(Java PriorityQueue默认为最小堆)和一个最大堆maxHeap,在输入数字的过程中,保证
- maxHeap.peek() <= minHeap.peek()
- maxHeap.size()与minHeap.size()相差不超过1
维护上面两个属性很简单,且看代码:
class MedianFinder {
private PriorityQueue<Integer> minHeap, maxHeap;
public MedianFinder() {
minHeap = new PriorityQueue<>();
maxHeap = new PriorityQueue<>((a, b) -> b - a);
}
public void addNum(int num) {
if (maxHeap.size() <= minHeap.size()) {
minHeap.add(num);
maxHeap.add(minHeap.remove());
} else {
maxHeap.add(num);
minHeap.add(maxHeap.remove());
}
}
public double findMedian() {
if (minHeap.size() == maxHeap.size()) {
if (minHeap.isEmpty()) return Double.NaN;
else return (minHeap.peek() + maxHeap.peek()) / 2.0;
} else if (maxHeap.size() > minHeap.size()) {
return maxHeap.peek();
} else {
return minHeap.peek();
}
}
}