当前位置: 首页 > news >正文

LeetCode295之数据流的中位数(相关话题:优先队列)

题目描述

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

  • 例如 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

思路分析

一开始没看懂题目,以为只要用List存储数据,取中位数即可,认真审题可以发现,中位数是有序整数列表中的中间值,所以必须对插入的数据先排序才能求中位值

在数据流中,数据会不断涌入结构中,那么也就面临着需要多次动态调整以获得中位数。 因此实现的数据结构需要既需要快速找到中位数,也需要做到快速调整。

首先能想到就是二叉搜索树,在平衡状态下,树顶必定是中间数,然后再根据长度的奇偶性决定是否取两个数。

此方法效率高,但是手动编写较费时费力。

根据只需获得中间数的想法,可以将数据分为左右两边,一边以最大堆的形式实现,可以快速获得左侧最大数, 另一边则以最小堆的形式实现。其中需要注意的一点就是左右侧数据的长度差不能超过1。 这种实现方式的效率与AVL平衡二叉搜索树的效率相近,但编写更快

显然,为了可以在 O(1) 的复杂度内取得当前中位数,我们应当令 l 为大根堆,r 为小根堆,并人为固定 l 和 r 之前存在如下的大小关系:

  1. 当数据流元素数量为偶数:l 和 r 大小相同,此时动态中位数为两者堆顶元素的平均值;
  2. 当数据流元素数量为奇数:l 比 r 多一,此时动态中位数为 l 的堆顶原数。

为了满足上述说的奇偶性堆大小关系,在进行 addNum 时,我们应当分情况处理:

插入前两者大小相同,说明插入前数据流元素个数为偶数,插入后变为奇数。我们期望操作完达到「l 的数量为 r 多一,同时双堆维持有序」,进一步分情况讨论:

  • 如果 r 为空,说明当前插入的是首个元素,直接添加到 l 即可;
  • 如果 r 不为空,且 num <= r.peek(),说明 num 的插入位置不会在后半部分(不会在 r 中),直接加到 l 即可;
  • 如果 r 不为空,且 num > r.peek(),说明 num 的插入位置在后半部分,此时将 r 的堆顶元素放到 l 中,再把 num 放到 r(相当于从 r 中置换一位出来放到 l 中)。

插入前两者大小不同,说明前数据流元素个数为奇数,插入后变为偶数。我们期望操作完达到「l 和 r 数量相等,同时双堆维持有序」,进一步分情况讨论(此时 l 必然比 r 元素多一):

  • 如果 num >= l.peek(),说明 num 的插入位置不会在前半部分(不会在 l 中),直接添加到 r 即可。
  • 如果 num < l.peek(),说明 num 的插入位置在前半部分,此时将 l 的堆顶元素放到 r 中,再把 num 放入 l 中(相等于从 l 中替换一位出来当到 r 中)。

 代码实现

class MedianFinder {//大顶堆PriorityQueue<Integer> l = new PriorityQueue<>((a,b)->b-a);//小顶堆(默认)PriorityQueue<Integer> r = new PriorityQueue<>((a,b)->a-b);public void addNum(int num) {int s1 = l.size(), s2 = r.size();if (s1 == s2) {if (r.isEmpty() || num <= r.peek()) {l.add(num);} else {l.add(r.poll());r.add(num);}} else {if (l.peek() <= num) {r.add(num);} else {r.add(l.poll());l.add(num);}}}public double findMedian() {int s1 = l.size(), s2 = r.size();if (s1 == s2) {return (l.peek() + r.peek()) / 2.0;} else {return l.peek();}}
}

相关文章:

LeetCode295之数据流的中位数(相关话题:优先队列)

题目描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化 Media…...

助你加速开发效率!告别IDEA卡顿困扰的性能优化技巧

在现代软件开发中&#xff0c;IDE&#xff08;集成开发环境&#xff09;是一个必不可少的工具。IntelliJ IDEA是一个广受欢迎的IDE&#xff0c;但有时候IDE的性能可能会受到影响&#xff0c;导致开发人员的工作效率降低。本文将介绍一些可以提高IDE性能的技巧&#xff0c;帮助开…...

Java设计模式-适配器模式

1、简介 适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式&#xff0c;它结合了两个独立接口的功能。 这种模式涉及到一个单一的类&#xff0c;该类负责加入独立的或不兼容的接口功能。 2、适配器模式分类 目标接口&#xff08;Target&#x…...

Linux 练习六 (IPC 管道)

文章目录1 标准管道流2 无名管道&#xff08;PIPE&#xff09;3 命名管道&#xff08;FIFO&#xff09;3.1 创建删除管道文件3.2 打开和关闭FIFO文件3.3 管道案例&#xff1a;基于管道的客服端服务器程序使用环境&#xff1a;Ubuntu18.04 使用工具&#xff1a;VMWare workstati…...

合并两个有序链表(精美图示详解哦)

全文目录引言合并两个有序链表题目描述方法一&#xff1a;将第二个链表合并到第一个思路实现方法二&#xff1a;尾插到哨兵位的头节点思路实现总结引言 在前面两篇文章中&#xff0c;我们介绍了几道链表的习题&#xff1a;反转链表、链表的中间结点、链表的倒数第k个结点&…...

33 JSON操作

目录 一、介绍 二、JSON的特点 三、JSON语法 1、json中的数据类型 四、JSON文件的定义 五、读取JSON文件 1、读取json文件的两种方式 &#xff08;1&#xff09;read、write &#xff08;2&#xff09;json.load 2、使用json.load读取json文件的步骤 3、练习读取json文件 六、练…...

三八妇女节快乐----IT女神活动随笔

献丑了&#xff0c;一首小小散文诗&#xff0c;请大家轻喷 O(≧口≦)O 我的答案 天下芸芸众生&#xff0c;好似夜幕漫天繁星。 与你相识&#xff0c;只是偶然。 简单的一个招呼&#xff0c;于是开始了一段故事。 我们或是诉说&#xff0c;或是分享&#xff1b; 我们彼此倾听&…...

【PSO-PID】使用粒子群算法整定PID参数控制起动机入口压力值

最近在学优化算法&#xff0c;接触到了经典寻优算法之粒子群PSO&#xff0c;然后就想使用PSO算法来调节PID参数&#xff0c;在试验成功之后将此控制算法应用到了空气起动系统上&#xff0c;同时与之前的控制器进行对比看看哪种控制效果最好。 0 引言 PID参数整定主要有两种&…...

当代数据分析指南:激发商业洞见的七个方法(上)

如果说眼下的发生的事能证明什么&#xff0c;那就是基于实时可信的数据分析正在变得越来越重要。但是要是想要在需要的时候准确地获取中肯的洞察&#xff0c;我们所需要的可不只是漂亮的可视化。 如何让你的员工都有能力和机会都做出最好的决策&#xff0c;不管这个决策会有多…...

javaWeb核心02-JSP、EL、JSTL、MVC

文章目录JSP1&#xff0c;JSP 概述2&#xff0c;JSP 快速入门2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试3&#xff0c;JSP 原理4&#xff0c;JSP 脚本4.1 JSP 脚本分类4.2 案例4.2.1 需求4.2.2 实现4.2.3 成品代码4.2.4 测试4.3 JSP 缺点5&#xff0…...

spring-boot+mybatis-plus连接Oracle数据库,及查询相关数据

配置java 略&#xff08;这里我用的是jdk1.8&#xff09; 配置maven 环境变量&#xff1a; M2_HOME&#xff1a;D:\LJ\software\java\maven\apache-maven-3.6.3 Path&#xff1a;%M2_HOME%\bin 仓库/jdk/镜像云设置(./config/sitting) 仓库 <localRepository> D:/…...

电商使用CRM系统有什么好处,如何选择

数据显示&#xff0c;使用电商CRM客户管理系统后&#xff0c;企业销售额提高了87%&#xff0c;客户满意度提高了74%&#xff0c;业务效率提高了73%。要在竞争激烈的电商市场取得成功&#xff0c;与目标受众的有效沟通是有效的方法。下面说说什么是电商CRM系统&#xff1f;电商C…...

Nacos2.2.0多数据源适配oracle12C-修改Nacos源码

从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 文章目录一…...

第十四届蓝桥杯三月真题刷题训练——第 5 天

目录 题目1&#xff1a;数的分解 题目描述 运行限制 代码&#xff1a; 题目2&#xff1a;猜生日 题目描述 运行限制 代码&#xff1a; 题目3&#xff1a;成绩分析 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 题目4&#xff1a;最大和…...

大数据框架之Hive:第3章 DDL(Data Definition Language)数据定义

第3章 DDL&#xff08;Data Definition Language&#xff09;数据定义 3.1 数据库&#xff08;database&#xff09; 3.1.1 创建数据库 1&#xff09;语法 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPER…...

概率论小课堂:统计学是大数据方法的基础

文章目录 引言I 统计学1.1 统计学的内容1.2 统计学的目的II 用好数据的五个步骤2.1 设立研究目标2.2 设计实验,选取数据。2.3 根据实验方案进行统计和实验,分析方差。2.4 通过分析进一步了解数据,提出新假说。2.5 使用研究结果III 数据没用好的原因3.1 霍桑效应3.2 数据的稀…...

监控集群概念讲解

监控概述 1、监控的重要性 监控是运维日常的重要工作之一&#xff1b; 监控是有多重要&#xff1f; 监控可以帮助运维监控服务器的状态&#xff1b;要及时解决&#xff1b; 如果淘宝、腾讯宕机了1个小时&#xff1f; 损失是无法估量的&#xff1b; 服务器是否故障、宕不…...

如何通过DAS连接GaussDB

文章目录1 实验介绍2 实验目的3 配置DAS服务4 SQL使用入门1 实验介绍 本实验主要描述如何通过华为云数据管理服务 (Data Admin Service&#xff0c;简称DAS) 来连接华为云GaussDB数据库实例&#xff0c;DAS是一款专业的简化数据库管理工具&#xff0c;提供优质的可视化操作界面…...

支持在局域网使用的项目管理系统有哪些?5款软件对比

一、选择私有部署的原因以及该方案的优点有很多可能的原因导致人们更倾向于使用私有部署的企业管理软件&#xff0c;其中一些原因可能包括&#xff1a;1.数据安全性要求&#xff1a;一些企业管理软件包含敏感的商业数据和隐私信息&#xff0c;为了保护这些信息不被未经授权的第…...

Linux CentOS7 MySQL 5.7安装

准备工作 //创建目录 mkdir /opt/mysql //跳转目录 cd /opt/mysql下载MySQL 请耐心等待&#xff0c;也可以在Windows下载以后上传到 /opt/mysql目录 wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar解压 tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-b…...

Kubernetes学习(四)控制器

ReplicaSet ReplicaSet的目的是维护一组在任何时候都处于运行状态的Pod副本的稳定集合。因此&#xff0c;它通常用来保证给定数量的、完全相同的Pod的可用性。 ReplicaSet的工作原理 ReplicaSet是通过一组字段来定义的&#xff0c;包括一个用来识别可获得的pod的集合的选择符…...

vue组件间通信的几个方法

一&#xff0c;props属性传递数据 适用场景&#xff1a;父组件传递数据给子组件 子组件设置props属性&#xff0c;定义接收父组件传递过来的参数 父组件在使用子组件标签中通过字面量来传递值 Children.vue props:{ // 字符串形式 name:String // 接收的类型参数 // 对象…...

商品价格区间设置与排序--课后程序(Python程序开发案例教程-黑马程序员编著-第4章-课后作业)

实例2&#xff1a;商品价格区间设置与排序 在网上购物时&#xff0c;面对琳琅满目的商品&#xff0c;我们应该如何快速选择适合自己的商品呢&#xff1f;为了能够让用户快速地定位到适合自己的商品&#xff0c;每个电商购物平台都提供价格排序与设置价格区间功能。假设现在某平…...

mybatis中sqlSession的使用

文章目录sqlsession的使用依赖jdbc.propertiesmysql-config.xml配置逆向工程创建sqlSessionsqlsession的使用 在最开始我们使用jdbcUtil的方式进行硬编码&#xff0c;sql字符串写的很难受&#xff0c;使用mybatis可以解决这个问题&#xff0c;它提供了数据库与实体类的关系映射…...

TPOT(Tree-based Pipeline Optimization Tool) API简介

文章目录TPOT简介TPOT APIClassification接口形式&#xff1a;Parameters&#xff1a;Attributes:Functions&#xff1a;Regression接口形式Parameters:&#xff08;只列与分类任务有差异的参数&#xff09;TPOT简介 TPOT是一个Python自动机器学习&#xff08;AML&#xff09;…...

Java 19和IntelliJ IDEA,如何和谐共生?

Java仍然是目前比较流行的编程语言&#xff0c;它更短的发布节奏让开发者每六个月左右就可以试用新的语言或平台功能&#xff0c;IntelliJ IDEA帮助我们更流畅地发现和使用这些新功能。IntelliJ IDEA v2022.3正式版下载(Q技术交流&#xff1a;786598704&#xff09;在本文中&am…...

js循环判断的方法

js循环判断的方法if语句if else语句if else if else if......三元表达式switchswitch语句和if语句的区别for循环while循环do while循环for inforEachfor of性能问题if语句 条件满足就执行&#xff0c;不满足就不执行 if(条件){语句}if else语句 条件满足&#xff0c;执行语句…...

git快速入门(1)

1 git的下载与安装1&#xff09;下载git安装包下载路径&#xff1a;https://git-scm.com/我的操作系统是window&#xff0c;64位的&#xff0c;我下载的Git-2.33.0-64-bit.exe&#xff0c;从官网下载或者从网址下载链接&#xff1a;链接地址&#xff1a;https://pan.baidu.com/…...

韩国绿芯1~16通道触摸芯片型号推荐

随着技术的发展&#xff0c;触摸感应技术正日益受到更多关注和应用&#xff0c;目前实现触摸感应的方式主要有两种&#xff0c;一种是电阻式&#xff0c;另一种是电容式。电容式触摸具有感应灵敏、功耗低、寿命长等特点&#xff0c;因此逐步取代电阻式触摸&#xff0c;成为当前…...

Go语言设计与实现 -- http服务器编程

Go http服务器编程 初始 http 是典型的 C/S 架构&#xff0c;客户端向服务端发送请求&#xff08;request&#xff09;&#xff0c;服务端做出应答&#xff08;response&#xff09;。 golang 的标准库 net/http 提供了 http 编程有关的接口&#xff0c;封装了内部TCP连接和…...

wordpress进后台/高端网站建设公司排名

1.流程示意图2.流程详解上面的流程是整个mapreduce最全工作流程&#xff0c;但是shuffle过程只是从第7步开始到第16步结束&#xff0c;具体shuffle过程详解&#xff0c;如下&#xff1a;1&#xff09;maptask收集我们的map()方法输出的kv对&#xff0c;放到内存缓冲区中2&#…...

怎么获取wordpress的权限/seo图片优化

转载&#xff1a;http://www.zuidai和ma.com/blog/2793091475983360.htm www.zuidai ma.com居然是违禁字符&#xff0c;我也是醉了&#xff0c;所以在www.zuidai后面加一个和字。 曾经公司的项目 让我弄个一个二维码的打印 客户要求选择博思得品牌打印机 我试过调用java里面的…...

东莞网站推广优化/宁波seo自然优化技术

cygwin的下的gcc的一点体会。1&#xff0c;源文件的扩展名为c,按C的规则编译&#xff1b;源文件的扩展名为cpp&#xff0c;按C的规则编译。注意&#xff1a;两者默认包括的文件也不同。2&#xff0c;gcc -o hello hello.o 按c方式生成exe。g -o hello hello.o 方式生成exe。c方…...

云落 wordpress/seo排名软件价格

react本身具有防范xss攻击功能&#xff0c;会自动转移字符串里HTML代码。 实现HTML标签功能方法&#xff1a; <div dangerouslySetInnerHTML{{__html: 从后台拿到字符串类型的标签}} /> 否则&#xff0c;应该是json&#xff0c;array类型&#xff0c;那么&#xff1a; re…...

西安在线网站制作/郑州专业网站建设公司

首先是二手表的意义。好端端有新表咱为啥不选新的想心思去买二手&#xff1f;有人回答“当然是因为便宜啦&#xff01;”这个回答对但不全对抛开购买价格&#xff0c;很多限量款热门款&#xff0c;专柜刚出就被抢光新的有钱都买不到只能在二手市场找&#xff0c;对于手表收藏家…...

WordPress在哪设置邮箱/seo优化培训班

初学Python&#xff0c;做了一个练习题&#xff0c;将一个数转换成人民币读法的字符串 #大写汉字 han_list ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖",&qu…...