41. 数据流中的中位数
Posted zzytxl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了41. 数据流中的中位数相关的知识,希望对你有一定的参考价值。
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
例如,
[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、findMedia
进行50000
次调用。
class MedianFinder { PriorityQueue<Integer> smaHeap; PriorityQueue<Integer> bigHeap; int count; /** initialize your data structure here. */ public MedianFinder() { count = 0; smaHeap = new PriorityQueue<>(); bigHeap = new PriorityQueue<Integer>((o1,o2)->(o2 - o1)); } public void addNum(int num) { count ++; if(count % 2 == 1){ //向大根堆插入数据,先与小根堆battle smaHeap.offer(num); bigHeap.offer(smaHeap.poll()); }else{ bigHeap.offer(num); smaHeap.offer(bigHeap.poll()); } } public double findMedian() { if(count % 2== 1){ return bigHeap.peek(); }else{ //注意返回值 return (bigHeap.peek() + smaHeap.peek()) / 2.0 ; } } } /** * Your MedianFinder object will be instantiated and called as such: * MedianFinder obj = new MedianFinder(); * obj.addNum(num); * double param_2 = obj.findMedian(); */
以上是关于41. 数据流中的中位数的主要内容,如果未能解决你的问题,请参考以下文章