LCR 160. 数据流中的中位数
中位数 是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5
设计一个支持以下两种操作的数据结构:
void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例 1:
输入:
[“MedianFinder”,“addNum”,“addNum”,“findMedian”,“addNum”,“findMedian”]
[[],[1],[2],[],[3],[]]
输出:[null,null,null,1.50000,null,2.00000]
示例 2:
输入:
[“MedianFinder”,“addNum”,“findMedian”,“addNum”,“findMedian”]
[[],[2],[],[3],[]]
输出:[null,null,2.00000,null,2.50000]
提示:
最多会对 addNum、findMedian 进行 50000 次调用。
找中位数
初步思路是每插入一个数就进行一次排序,时间复杂度为nlogn,会超时
因为每次插入数前数组都是有序的,所以我们可以通过二分法来查找要插入到哪;
1 | class MedianFinder { |
1 | void addNum(int num) { |
进一步,因为每次插入的都是中间位置,所以我们可以把数组分两部分,左边是小的一部分,右边是大的一部分,分别用大顶堆小顶堆来维护。
每次先插入左边,然后把左边最大值给右边(就是进来一个数先两边都过一下,确保这个数在两堆大小相等前先处于正确的位置)
1 | class MedianFinder { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.




