LeetCode Find Median from Data Stream 堆

本文介绍了一种利用最大堆与最小堆的数据结构来高效地维护一系列数字的中位数的方法。通过确保两个堆之间的平衡,可以快速获得当前数据流的中位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

参考DISCUSS。

通过大顶堆+小顶堆来实现。经典。

大顶堆中堆顶的元素如果小于小顶堆堆顶的元素,则大顶堆中的所有元素就都小于小顶堆中的所有元素。如果再保证maxHeap.size()==minHeap.size() 或者 maxHeap.size() == minHeap.size() + 1的话,就使用两个堆顶元素就可以直接计算出中位数。

所以得出:

  1. 如果maxHeap.size()==minHeap.size() ,(大顶堆堆顶元素+小顶堆堆顶元素)/2就是中位数;
  2. 如果maxHeap.size() == minHeap.size() + 1,大顶堆堆顶元素就是中位数;

java code:

class MedianFinder {

    PriorityQueue<Long> maxHeap;
    PriorityQueue<Long> minHeap;
    public MedianFinder() {
        maxHeap = new PriorityQueue<Long>(Collections.reverseOrder());//change to a maximum heap
        minHeap = new PriorityQueue<Long>();//heap is a minimal heap by default
    }
    // Adds a number into the data structure.
    public void addNum(int num) {
        maxHeap.add((long)num);
        minHeap.add(maxHeap.poll());
        if(maxHeap.size() < minHeap.size()) {
            maxHeap.add(minHeap.poll());
        }
    }

    // Returns the median of current data stream
    public double findMedian() {
        if(maxHeap.size() == minHeap.size()) {
            return (maxHeap.peek() + minHeap.peek()) / 2.0;
        }else {
            return maxHeap.peek();
        }
    }
};

// Your MedianFinder object will be instantiated and called as such:
// MedianFinder mf = new MedianFinder();
// mf.addNum(1);
// mf.findMedian();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值