一、题目解析
如何得到一个数据流中的中位数?
如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。
如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
该题为了保证插入数据和取中位数都高效,使用 大顶堆+ 小顶堆完成
大顶堆用来存放较小的数,从大到小排列,小顶堆用来存放较大的数,从小到大排列,所以中位数就是大顶堆的根节点和小顶堆的根节点和的平均数
(1)小顶堆的数据都大于大顶堆的元素,所以每次入堆,不是直接进去,而是从另一个堆中 poll 出一个最大(最小)值,来进入另一个堆。
(2)当数目为奇数时,将值插入大顶堆,然后将大顶堆的最大值(根节点)插入到小顶堆中
(3)当数目为偶数时,将值插入小顶堆,然后将小顶堆中的最小值(根节点)插入到大顶堆中
(4)中位数:当前个数为偶数则取小顶堆和大顶堆的根节点的平均值&#