首页 > 其他分享 >【Leetcode 热题 100】295. 数据流的中位数

【Leetcode 热题 100】295. 数据流的中位数

时间:2025-01-15 10:00:31浏览次数:3  
标签:maxHeap MedianFinder 元素 中位数 堆中 num 100 295 热题

问题背景

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

  • 例如 a r r = [ 2 , 3 , 4 ] arr = [2,3,4] arr=[2,3,4] 的中位数是 3 3 3。
  • 例如 a r r = [ 2 , 3 ] arr = [2,3] arr=[2,3] 的中位数是 ( 2 + 3 ) / 2 = 2.5 (2 + 3) / 2 = 2.5 (2+3)/2=2.5。
    实现 MedianFinder 类:
  • MedianFinder() 初始化 MedianFinder 对象。
  • void addNum(int num) 将数据流中的整数 n u m num num 添加到数据结构中。
  • double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 1 0 − 5 10 ^ {-5} 10−5 以内的答案将被接受。

数据约束

  • − 1 0 5 ≤ n u m ≤ 1 0 5 -10 ^ 5 \le num \le 10 ^ 5 −105≤num≤105
  • 在调用 findMedian 之前,数据结构中至少有一个元素
  • 最多 5 ∗ 1 0 4 5 * 10 ^ 4 5∗104 次调用 addNumfindMedian

解题过程

这题分类讨论的思路比较麻烦,但是实现起来相当简洁,积累一下为好。
整体的结构是由一个最大堆和一个最小堆构成的,维护结构的过程中让这两个堆中的元素始终相等或最大堆中的元素比最小堆中的元素多,并且相差不能超过 1 1 1。
最大堆中存储数据流中较小的那部分元素,最小堆中存储数据流中较大的那部分元素,这时中位数就可以根据两个堆顶元素方便地计算出来。数字数量不等时,中位数就是最大堆的堆顶元素;元素数量相等时,中位数就是两个堆顶元素的平均值。
以下 n u m num num 表示数据流中的新元素, m a x max max 表示最小堆中的最大值, m i n min min 表示最大堆中的最小值。

  • 如果两个堆中元素数量相等:
    • 当前元素较大的情况下, n u m num num 应被添加到最小堆中。这样一来就不符合定义了(最小堆比最大堆元素数量多 1 1 1),将 m a x max max 调整到最大堆中。
    • 当前元素较小的情况下, n u m num num 应被添加到最大堆中。这种情况同样可以先将元素添加到最小堆中,再将 m a x max max 调整到最大堆中。
  • 如果两个堆中元素数量不等:
    • 当前元素较小的情况下, n u m num num 应被添加到最大堆中。这样一来就不符合定义了(最大堆比最小堆元素数量多 2 2 2),将 m i n min min 调整到最小堆中。
    • 当前元素较大的情况下, n u m num num 应被添加到最小堆中。这种情况同样可以先将元素添加到最大堆中,再将 m i n min min 调整到最小堆中。

实际写的时候,只要搞清楚什么情况下该怎么倒腾元素就不会出错。
Java 中的类默认自带一个空参构造器,所以实际上 MedianFinder() 可以不写。

具体实现

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

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

标签:maxHeap,MedianFinder,元素,中位数,堆中,num,100,295,热题
From: https://blog.csdn.net/2401_88859777/article/details/145153732

相关文章

  • 必读的100篇生成式AI论文清单
    2024年真是生成式人工智能研究大放异彩的一年!最让我们惊讶的是,整个领域的焦点发生了翻天覆地的变化。尤其是在2023年和2024年,情况开始变得截然不同,由于大模型模型已经能够做很多事情,因此也更加关注应用层面的研究。论文集合地址:https://github.com/aishwaryanr/aweso......
  • 【练习】力扣热题100 有效的括号
    题目给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例1:输入:s=“()”输出:true示例2:输......
  • 华为OD E卷(100分)56-矩阵扩散
     前言    工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老,没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练......
  • 3分钟搞懂Arrow Flight SQL,让数据传输提速100倍的秘密
    3分钟搞懂ArrowFlightSQL,让数据传输提速100倍的秘密数据传输提速100倍!如何做到100倍提升?让数据传输起飞!小结此时,数据分析师小华揉着发酸的眼睛,望着电脑屏幕发呆。他忍不住抱怨道:“这数据导出也太慢了吧!”是的,又一次等待MySQL协议传输大批量数据,这感觉像是用吸管......
  • HDLBits-Verilog:Counter 1000
    从1000Hz时钟中,得出一个1Hz信号,称为 OneHertz,该信号可用于驱动一组小时/分钟/秒计数器的启用信号,以创建数字挂钟。由于我们希望clock每秒计数一次,因此 OneHertz 信号必须每秒正好置位一个周期。使用modulo-10(BCD)计数器和尽可能少的其他门构建分频器。此外,还输出......
  • 利用CSS改变图片颜色的100种方法!
    https://juejin.cn/post/6844903682010513415前言“说到对图片进行处理,我们经常会想到PhotoShop这类的图像处理工具。作为前端开发者,我们经常会需要处理一些特效,例如根据不同的状态,让图标显示不同的颜色。或者是hover的时候,对图片的对比度,阴影进行处理。”你以为这些是经......
  • LeetCode 热题 HOT 100
    点个关注,不迷路!(╯▽╰)好香~~在学习过程中,借助一些优秀的工具可以极大地提升我们的学习效率。例如,使用LeetCode插件,它能够帮助你显示力扣周赛难度分数,让你更好地了解题目的难度,从而合理安排学习计划。算法学习路线推荐基础夯实:先过B站“灵茶山艾府”的“基础算法......
  • LeetCode热题100-两数相加【JavaScript讲解】
    题目:题解:根据题目(2->4->3)+(5->6->4)=(7->0->8),根据加法的计算过程我们知道首先从低位开始算起,也就是说应该先计算2+5=7;4+6=10,向前进一位,此处取余数0;3+4+进一位的1=8;所以答案是7->0->8。最关键的是最后的进位一定要记得,如果最后相加的和需要进位!!!解题代码:/***......
  • LeetCode100之分割回文串(131)--Java
    1.问题描述        给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。        示例1输入:s="aab"输出:[["a","a","b"],["aa","b"]]    示例2 输入:s="a"输出:[["a"]]        提......
  • (倍福授权)国产EtherCAT从站控制芯片P2P替代ET1100
    EtherCAT技术是德国的倍福自动化(Beckhoff)开发,处于EtherCAT技术协会(ETG)框架之下,是一项开放但不开源的技术,任何相关设备的开发,都需要向其获取相关授权。就目前来看,获得Beckhoff授权的厂商并不多,而且大部分都是海外半导体厂商。不过近几年,随着国内EtherCAT市场的增长,情况开始有所改......