2019.3.2 《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门
这道题有技巧,想要实时获得中位数,需要最大堆+最小堆的数据结构,将所有大于等于中位数的元素放在最小堆,将所有小于中位数的元素放在最大堆。
对数据总数进行计数,要保证:
1. 在总数为奇数时,直接弹出最小堆堆顶即为中位数,即此时最小堆元素比最大堆元素多1个。
2.在总数为偶数时,弹出最小堆堆顶和最大堆堆顶取平均即为中位数,即此时最大堆元素和最小堆元素相等。
因此,对于每次数据流中的新元素:
1.若该元素是第奇数个元素,元素先经过最大堆过滤,将最大堆堆顶元素(最小值)放入最小堆。
2.若该元素是第偶数个元素,元素先经过最小堆过滤,将最小堆堆顶元素(最大值)放入最大堆。
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
Java实现:
/**
*