数据流中中位数的问题
LeetCode295,中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如:[2,3,4]的中位数是3
2,3\]的中位数是(2+3)/2=2.5
实现 MedianFinder 类:
* MedianFinder() 初始化 MedianFinder 对象。
* void addNum(int num) 将数据流中的整数 num 添加到数据结构中。
* double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

分析这是一道比较难的题目了,如果没专门学过,很难在面试时想到。
中位数的题,我们一般都可以用大顶堆+小顶堆来求解,下面我们通过直观的例子解释一下怎么做。
小顶堆(minHeap):存储所有元素中较大的一半,堆顶存储的是其中最小的数。
大顶堆(maxHeap):存储所有元素中较小的一半,堆顶存储的是其中最大的数。
相当于,把所有元素分成了大和小两半,而我们计算中位数,只需要大的那半的最小值和小的那半的最大值即可。比如,我们依次添加\[1,2,3,4,5\],砍成两半之后为\[1,2\]和\[3,4,5\],我们只要能快速的找到2和3即可。
下面看看使用两个堆它们是怎么变化的:
1.添加1,进入到minHeap中,中位数为1:
2.添加2,它比minHeap堆顶元素1大,进入minHeap,同时,minHeap中元素超过了所有元素总和的一半,所以,要平衡一下,分一个给maxHeap,中位数为(1+2)/2.0=1.5:
添加3,它比minHeap堆顶元素2大,进入minHeap,中位数为2:
添加4,它比minHeap堆顶元素2大,进入minHeap,同时,minHeap中元素超过了所有元素总和的一半,所以,要平衡一下,分一个给maxHeap,中位数为(2+3)/2.0=2.5:
5.添加5,它比minHeap堆J顶元素3大,进入minHeap,中位数为3:
Java中的堆(即优先级队列)是使用完全二叉树实现的,我们这里的图也是以完全二叉树为例。理解了上述的过程,看代码就比较简单了
代码如下
```java
class MedianFinder {
PriorityQueue