LeetCode[295]数据流的中位数

news2025/1/19 23:19:08

难度:困难

题目:

中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
例如 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


提示:

  • -105 <= num <= 105

  • 在调用 findMedian 之前,数据结构中至少有一个元素

  • 最多 5 * 104 次调用 addNum 和 findMedian


Related Topics

  • 设计

  • 双指针

  • 数据流

  • 排序

  • 堆(优先队列)


重点!!!解题思路

第一步:

这种题中位数两边,左边最后一个是左边的最大值,右边的第一个是右边的最小值
求集合最值问题均可以使用堆(优先队列)来解决

第二步:

左边要求最大值,那么就是一个大顶堆
右边要求最小值,那么就是一个小顶堆
两个堆对顶

第三步:

明确了主要解题思路,这种题解法就很简单了
注意在添加元素时要始终保持两个堆的长度平衡

源码+讲解

class MedianFinder {
    PriorityQueue<Integer> big;
    PriorityQueue<Integer> small;
    public MedianFinder() {
        small = new PriorityQueue<>();
        big = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
    }
    
    public void addNum(int num) {
        if (big.isEmpty() || big.peek()>num){//比大顶堆小进入大顶堆,比小顶堆大进入小顶堆
            big.offer(num);
        }else {
            small.offer(num);
        }
        if (small.size()>big.size()){//右面比左面多就往左面挪
            big.offer(small.poll());
        }
        if (big.size()==small.size()+2){//左面的长度比右面长度多2了,就往右面挪
            small.offer(big.poll());
        }
    }
    
    public double findMedian() {
        if ((big.size()+small.size())%2!=0) return big.peek();
        return (small.peek()+ big.peek())/2.0;
    }
}

运行结果:

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工信部及多地政府联合阿里健康在全国展开防疫保供专项行动

为了切实服务好百姓的购药需求&#xff0c;在工信部和各地政府的指导下&#xff0c;12月疫情政策调整以来&#xff0c;阿里健康已先后在全国20多个省市及地区配合药品物资精准投放工作&#xff0c;为各地居民重点供退热药、N95口罩等紧缺药品和物资&#xff0c;尽全力打好药品保…

Android系统定制开发过程快速查找定位分析代码的方法

推荐阅读 ​Android系统开发过程快速查找定位代码的方法 Android10以上系统定制Root权限(隐藏Root权限) 商务合作 2023年招聘 2023年逆向分析资料汇总 Android系统开发过程&#xff0c;经常需要进行文件查找、代码查找&#xff0c;常用find和grep查找命令 1.find命令 根据文…

短短六年时间冲到二奢品类第一,妃鱼如何做到的?

随着消费需求不断增长&#xff0c;二手奢侈品市场近五年来快速向规模化、平台化发展&#xff0c;妃鱼、红布林、胖虎等二奢电商品牌迅速崛起&#xff0c;成为风头劲胜的网红。国泰君安研究报告显示&#xff0c;中国闲置高端消费品零售市场规模已从2016年162亿元增长至2020年的5…

Vue js混淆加密 webpack-obfuscator

公司要求加密混淆js 之前 是用的glifyjs-webpack-plugin ,感觉不行。 然后使用了webpack-obfuscator 非常nice~&#xff0c;除了打包出来体积会有点大&#xff0c;浏览的网页会变慢&#xff0c;选择最低是就还好&#xff0c; 有多个条件属性可以选择&#xff0c; 可以选择高度混…

networkx学习(三) 随机网络

networkx学习(三) 随机网络 1.规则网络 2.随机网络的生成算法 第一种:G(N,L) import random import itertoolsdef GNL(N, L):G = nx.Graph()G.

硬盘数据如何恢复?电脑硬盘资料恢复,方法就是这么简单!

硬盘作为重要的存储设备&#xff0c;里面保存的数据是很重要的。日常生活和工作中&#xff0c;硬盘发生数据丢失也是很常见的事情&#xff0c;比如&#xff1a;误删重要文件并清空了回收站、文件打不开提示格式化、分区变成RAW格式、电脑重新分区等。各种数据丢失原因数不胜数。…

卷积神经网络-cnn和lstm

文章目录1. 卷积神经网络1.1 卷积神经网络的基础1.2 卷积神经网络和传统的网络的区别1.3 卷积的作用1.3.1 图像颜色通道1.3.2 卷积的次数1.4 卷积层涉及的参数1.4.1 滑动窗口的步长1.4.2 卷积核的大小1.4.3 边缘填充1.4.4 卷积核的个数1.4.5 卷积参数共享1.5 池化层1.6 整体网络…

如何在Microsoft Word设置导航窗格以重新排列页面

本文包括使用导航窗格和复制粘贴在Microsoft Word 2019、2016和Office 365中移动页面的说明。 Microsoft Word不会将文档视为单独页面的集合,而是将其视为一个长页面。因此,重新排列Word文档可能会很复杂。在Word中移动页面的一种更简单的方法是使用导航窗格。 注意:要在导…

Vue 3 桌面应用开发(文末附视频)

在正式开始之前&#xff0c;我想先直接“输出”一些背景信息&#xff0c;既能阐明我的观点&#xff0c;也希望可以坚定你学习本小册的决心。 首先&#xff0c;桌面应用开发在未来一定会大放异彩&#xff0c;桌面应用相对于移动应用来说优势非常明显&#xff08;交互区域更大、…

TCP/IP网络编程(3)——地址族与数据序列

文章目录第 3 章 地址族与数据序列3.1 分配给套接字的 IP 地址与端口号3.1.1 网络地址&#xff08;Internet Address&#xff09;3.1.2 网络地址分类与主机地址边界3.1.3 用于区分套接字的端口号3.2 地址信息的表示3.2.1 表示 IPV4 地址的结构体3.2.2 结构体 sockaddr_in 的成员…

王道操作系统笔记(二)———— 进程与线程

文章目录一、进程的概念和特征1.1 进程的概念1.2 进程的组成1.3 进程的特征1.4 进程的状态与转换1.5 进程控制1.6 进程的通信1.6.1 共享存储1.6.2 消息传递1.6.3 管道通信1.7 父进程与子进程二、线程概念和多线程模型2.1 线程的概念2.2 线程的属性2.3 线程的实现方式2.4 多线程…

C#【必备技能篇】DatagridView添加行时,设置行标题单元格的值为行数

文章目录1、DatagridView添加行的代码2、方法一&#xff1a;【每次添加行都重新刷新了全部的行数&#xff0c;不推荐】3、方法二&#xff1a;【只有一个DatagridView时&#xff0c;推荐此方法】4、方法三&#xff1a;【通用方法&#xff0c;多个DatagridView都有这个需求时&…

利用 Burp Suite 进行密码爆破

利用 Burp Suite 进行密码爆破1.Intruder 功能介绍2.攻击类型3.实战4.验证码爆破1.Intruder 功能介绍 使用 BP 工具的 Intruder 模块高度可配置&#xff0c;可以对目标网站进行密码爆破&#xff0c;一般被用于网站的安全渗透测试场景 BP 工具的 Intruder 模块包含几个功能标签…

解决2022.3.1版本中 IDEA中 XML文件屎黄色背景 的方法

问题&#xff1a;在idea打开mybatis的xml映射文件&#xff0c;出现大面积黄色背景提示 1&#xff1a;打开文件&#xff0c;点击设置 2&#xff1a;打开编辑器--> 检查--> SQL 3&#xff1a;受不了&#xff0c;我的是中文&#xff0c;我换成英文继续了 找到 No data sou…

CDH6.3.2 ORC文件格式 Spark引擎查询数组越界异常

组件版本: flink1.13.2 cdh6.3.2 hive2.1.1 问题描述: CDH6.3.2 ORC文件格式 Spark引擎查询数组越界异常 java.io.IOException: java.lang.ArrayIndexOutOfBoundsException: 7 ‘org.apache.orc.impl.ReaderImpl::ReaderImpl.java:385’, org.apache.hadoop.hive.ql.io.orc.Re…

解决OBS录屏模糊问题

相信大家在使用OBS过程中也会遇到录屏模糊的问题&#xff0c;网上有很多配置教程&#xff0c;尝试了视频比特率、提高OBS当中其他的硬件参数。 模糊是要分情况的&#xff0c;如果是静态情况下模糊&#xff0c;就是屏幕不动的时候录制的视频也很模糊&#xff0c;那就是视频的基…

linux中使用KubeSphere和k8s 部署springboot项目

1、创建项目----》按照做的项目名称建 创建一个项目 创建后&#xff0c;如图所示&#xff1a; 2、工作负载---》就是创建服务容器Prod第一步&#xff1a;创建一个工作负载服务-->基本信息第二步&#xff1a;容器组设置 设置容器端口&#xff0c;健康检查&#xff0c;环境…

基于Gentoo发行版本的Calculate Linux 23发布

导读Calculate Linux 是一个为在组织环境中快速部署而优化的 Linux 发行版。它以 Gentoo Linux 项目为基础&#xff0c;包括许多预配置的功能。 Calculate Linux 以五种方式发布。Calculate Linux Desktop&#xff08;CLD&#xff09;、Calculate Directory Server&#xff08;…

【涵子来信python大全】——第二季——opencv第三篇-numpy和颜色通道解释

各位亲爱的读者&#xff0c;博主&#xff1a; 大家好&#xff0c;我是涵子。今天我们继续讲讲opencv&#xff0c;讲讲其中numpy的秘密。如果不清楚上一章的内容&#xff0c;请从链接或者主页回去先读一遍之前的文章&#xff0c;否则今天的内容很难理解。 【涵子来信&pyth…

人工智能ai写作系统,ai智能写作机器人

人工智能AI大数据深度&#xff1a;基于伪原创算法&#xff0c;采用神经网络算法&#xff0c;在超过1535000篇文章中进行自动学习、聚合算法进行人工智能的创建&#xff0c;内容语义不变&#xff0c;媒体阿里、腾讯、百度均于日前在百家号内容创作者盛典上推出人工智能创作支撑平…