第 41 题:数据流中的中位数
传送门:AcWing:数据流中的中位数。
如何得到一个数据流中的中位数?
如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。
如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
样例
输入:1, 2, 3, 4 输出:1,1.5,2,2.5 解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。
参考资料:LeetCode 第 295 题:数据流的中位数。
《剑指 Offer (第 2 版)》第 41 题:数据流中的中位数-1
《剑指 Offer (第 2 版)》第 41 题:数据流中的中位数-2
问题:1、上面的思路是很简单的,想想用 Python 如何实现。
2、LeetCode 上面第 4 题:排序数组的中位数如何求?
另一种使用堆的解法:这道题是堆解决的问题。
用两个堆:max heap 和 min heap,再一个median值, 维持两个堆的大小相等(max堆可以比min堆多一个). 对于新来的元素,比较新元素和median的大小,如果大于median就放入最小堆里面,如果小于median就放入最大堆里面,如果max heap,和min heap不平衡了,就调整一下。 然后调整过后median 里面的值就是我们要求的中位数。
《剑指 Offer (第 2 版)》第 41 题:数据流中的中位数-3
C++ 代码:
《剑指 Offer (第 2 版)》第 41 题:数据流中的中位数-4