295. 数据流的中位数
-
题目
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5
设计一个支持以下两种操作的数据结构:
void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例 1:
addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2
-
难度:困难
-
分类:多做
-
题解
运用到了新知识,大小堆。大堆是完全二叉树,里面按照父节点比子节点大排列,小堆是父节点值比子节点小排列。通过大小堆的入堆和出堆,便能够对序列进行排列,代码如下:
class MedianFinder { /** initialize your data structure here. */ PriorityQueue<Integer> max; PriorityQueue<Integer> min; public MedianFinder() { //小堆 max=new PriorityQueue<>((a,b)->(a-b)); //大堆 min=new PriorityQueue<>((a,b)->(b-a)); } public void addNum(int num) { max.add(num); min.add(max.poll()); if(min.size()>max.size()) { max.add(min.poll()); } } public double findMedian() { if(max.size()==min.size()) { return (double)(max.peek()+min.peek())/2; } return max.peek(); } }那么按照以上方式提交的结果则是:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-median-from-data-stream
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
该博客介绍了如何设计一个数据结构,用于在数据流中动态添加整数并实时找到所有元素的中位数。核心思路是利用两个优先级队列(大顶堆和小顶堆)来维护数据的顺序。当数据量为奇数时,中位数在大顶堆的顶部;当数据量为偶数时,中位数是大顶堆顶部元素和小顶堆顶部元素的平均值。这种方法能够在O(logn)的时间复杂度内完成添加和查找操作。
1万+

被折叠的 条评论
为什么被折叠?



