404 字
2 分钟
LeetCode刷题(数据流的中位数)

数据流的中位数#

题目描述#

中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。

  • 例如 arr = [2,3,4] 的中位数是 3
  • 例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5

实现 MedianFinder 类:

  • MedianFinder() 初始化 MedianFinder 对象。
  • void addNum(int num) 将数据流中的整数 num 添加到数据结构中。
  • double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

示例 1:

输入
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
输出
[null, null, null, 1.5, null, 2.0]

解释
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1);    // arr = [1]
medianFinder.addNum(2);    // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3);    // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0

题解#

构造两个堆,一个最大堆存放元素较小的部分,一个最小堆存放元素较大的那部分,维护两个队,使其平衡并保证最大堆的最大值效益最小堆的最小值

即先放元素到最大堆,将最大堆中的最大值移除放入最小堆(如此保证最大堆的最大值放入最小堆不会违反最大堆的最大值效益最小堆的最小值),反之亦然(要保证元素平衡放置)

class MedianFinder {
    PriorityQueue<Integer> minHeap = new PriorityQueue<>();
    PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> (b - a));    
    public void addNum(int num) {
        if(minHeap.size() == maxHeap.size()) {
            maxHeap.add(num);
            minHeap.add(maxHeap.poll());
        } else {
            minHeap.add(num);
            maxHeap.add(minHeap.poll());
        }
    }
    
    public double findMedian() {
        return minHeap.size() == maxHeap.size() ? (minHeap.peek() + maxHeap.peek()) / 2.0 : minHeap.peek();
    }
}
LeetCode刷题(数据流的中位数)
https://thrinisty.github.io/Blog/posts/leetcode刷题数据流的中位数/
作者
Thrinisty
发布于
2026-01-04
许可协议
CC BY-NC-SA 4.0