LeetCode-295. Find Median from Data Stream

发布于 2024-04-28 06:09:38 字数 2248 浏览 30 评论 0

题目

解析

准备两个堆: 一个最大堆( maxHeap ),一个最小堆 minHeap

  • 最大堆存储较小元素的一半,最大堆存储较大元素的一半;
  • 添加元素后,始终要维持要么两个堆的元素相等,要么左边的堆( maxHeap ) 元素比右边多一个;
  • 如果不是上面两种情况,就要在添加元素之后维护;
  • findMedian 函数: 查询时,如果两个堆的元素个数相等就返回两个堆顶的元素的和除以一半,否则返回 maxHeap.peek()

看一个例子:

numsmaller(maxHeap)bigger(minHeap)median
55 5.0
8586.5
2[2、5]85
11[2、5][8、11]6.5
3[2、3、5][8、11]5
4[2、3、4、5][8、11]先调整
 [2、3、4][5、8、11]4.5
14[2、3、4][5、8、11、14]先调整
 [2、3、4、5][8、11、14]5
class MedianFinder {

    private PriorityQueue<Integer>maxHeap; // 第一个(更小的) 是最大堆 (左边的)
    private PriorityQueue<Integer>minHeap; // 第二个(更大的) 是最小堆 (右边的)
   
    public MedianFinder() {
        maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
        minHeap = new PriorityQueue<>(); // java 默认是最小堆 (堆顶最小)
    }

    public void addNum(int num) {
        if(maxHeap.isEmpty() || (!maxHeap.isEmpty() && num <= maxHeap.peek()))
            maxHeap.add(num);
        else
            minHeap.add(num);

        if(maxHeap.size() < minHeap.size())
            maxHeap.add(minHeap.poll());
        else if(maxHeap.size() - minHeap.size() == 2)
            minHeap.add(maxHeap.poll());
    }

    public double findMedian() {
        if(maxHeap.size() == minHeap.size())
            return (maxHeap.peek() + minHeap.peek())/2.0;
        else    // minHeap.size() = maxHeap.size() + 1;
            return maxHeap.peek();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文