0堆困难 LeetCode295. 数据流的中位数

本文介绍如何使用堆数据结构设计一个高效的数据结构MedianFinder,用于实现实时添加整数并快速查找中位数。通过维护大小顶堆和最小堆,可以在O(logn)时间内完成添加和查询操作。适用于大数据流场景,避免了排序带来的时间复杂度提升。
摘要由CSDN通过智能技术生成

295. 数据流的中位数

描述

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例:

分析

分别建立大小顶堆,各占元素总数的一半,可通过两个堆的顶点求数据流的中位数。
若采取每次添加一个数然后再排序会超时,而堆不会(不懂为什么)。

class MedianFinder {
    PriorityQueue<Integer> maxHeap ;
    PriorityQueue<Integer> minHeap ;
    double mid;
    public MedianFinder() {
        maxHeap = new PriorityQueue<>((a,b)->(b-a));
        minHeap = new PriorityQueue<>();
        mid = 0;
    }
    
    public void addNum(int num) {
       if(maxHeap.size() == minHeap.size()){
           maxHeap.offer(num);
           minHeap.offer(maxHeap.poll());
           mid = minHeap.peek();
       }else{
           minHeap.offer(num);
           maxHeap.offer(minHeap.poll());
           mid = (maxHeap.peek() + minHeap.peek()) / 2.0;
       }
    }
    
    public double findMedian() {
        return mid;
    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值