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

算法通关村14关 | 数据流中位数问题

1. 数据流中位数问题

题目

 LeetCode295: 中位数是有序列表中间的数,如果列表长度是偶数,中位数是中间两个数的平均值,

例如:[2,3,4]的中位数是3,

[2,3]中位数是(2+3)/ 2= 2.5

设计一个数据结构:

void addNum(int num) 从数据流中添加一个整数到数据结构中

double findMedian()-返回目前所有元素的中位数。

思路

用大顶堆+小顶堆来求解,

小顶堆:存储所有元素中较大的一半,堆顶存储的是其中最小的数

大顶堆:存储所有元素中较小的一半,堆顶存储的是其中最大的数

相当于把元素分为两半,我们计算中位数,只需要小顶堆和大顶堆的根节点即可。

以[1,2,3,4,5]为例,砍成两半后为[1,2]和[3,4,5]我们只要能快速找到2和3即可。

下面看看使用两个堆是怎么变化的

  1. 添加1,进入minHeap中,中位数是1,
  2. 添加2,比民Heap堆顶元素1大,进入minHeap中,同时minHeap中元素超过了所有元素的总和的一半,所以要平衡一下,分一个给maxHeap,中位数是(1+2)/2=1.5.
  3. 添加3,它比minHeap堆顶的元素2大,进入minHeap,中位数为2。
  4. 添加4,比minHeap堆顶的元素2大,进入minHeap,,同时minHeap中元素超过了所有元素的总和的一半,所以要平衡一下,分一个给maxHeap,中位数是(2+3)/2=2.5.
  5. 添加5,它比minHeap堆顶的元素3大,进入minHeap,中位数为3。

代码

public class MediaFinder {//小顶堆存储的是比较大的元素,堆顶是其中的最小值PriorityQueue<Integer> minHeap;//大顶堆存储的是比较大的元素,堆顶是其中的最大值PriorityQueue<Integer> maxHeap;public MediaFinder(){this.minHeap = new PriorityQueue<Integer>();this.maxHeap = new PriorityQueue<Integer>((a, b) -> (b - a));}public void addNum(int num){//小顶堆存储的是比较大的元素,num比较大元素中最小的还大,所以,进入minHeapif (minHeap.isEmpty() || num > minHeap.peek()){minHeap.offer(num);//如果minHeap比maxHeap多两个元素,就平衡if (minHeap.size() - maxHeap.size() > 1){maxHeap.offer(minHeap.poll());}}else {maxHeap.offer(num);//这样可以保证多的那个元素一定在minHeap中if (maxHeap.size() - minHeap.size() > 0){minHeap.offer(maxHeap.poll());}}}public double findMedian(){if (minHeap.size() > maxHeap.size()){return minHeap.peek();} else if (minHeap.size() < maxHeap.size()) {return maxHeap.peek();}else {return (minHeap.peek() + maxHeap.peek())/2.0;}}
}

相关文章:

算法通关村14关 | 数据流中位数问题

1. 数据流中位数问题 题目 LeetCode295: 中位数是有序列表中间的数&#xff0c;如果列表长度是偶数&#xff0c;中位数是中间两个数的平均值&#xff0c; 例如:[2,3,4]的中位数是3&#xff0c; [2,3]中位数是&#xff08;23&#xff09;/ 2 2.5 设计一个数据结构&#xff1a; …...

工厂模式 与 抽象工厂模式 的区别

工厂模式&#xff1a; // 抽象产品接口 interface Product {void showInfo(); }// 具体产品A class ConcreteProductA implements Product {Overridepublic void showInfo() {System.out.println("This is Product A");} }// 具体产品B class ConcreteProductB impl…...

安装虚拟机+安装/删除镜像

安装虚拟机 注意&#xff0c;官网可能无法登录&#xff0c;导致无法从官网下载&#xff0c;就自己去网上搜靠谱的下载&#xff0c;我用的16.2.3 删除镜像 Vm虚拟机怎么删除已经创建的系统&#xff1f;Vm虚拟机创建好之后iso删除方法 - 系统之家 (xitongzhijia.net) 安装镜像…...

MySQL的内置函数复合查询内外连接

文章目录 内置函数时间函数字符串函数数学函数其他函数 复合查询多表笛卡尔积自连接在where中使用子查询多列子查询在from中使用子查询 内连接外连接左外连接右外连接 内置函数 时间函数 函数描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳…...

操作系统(OS)与系统进程

操作系统&#xff08;OS&#xff09;与系统进程 冯诺依曼体系结构操作系统(Operator System)进程基本概念进程的描述&#xff08;PCB&#xff09;查看进程通过系统调用获取进程标示符&#xff08;PID&#xff09;通过系统调用创建进程&#xff08;fork&#xff09;进程状态&…...

防重复提交:自定义注解 + 拦截器(HandlerInterceptor)

防重复提交&#xff1a;自定义注解 拦截器&#xff08;HandlerInterceptor&#xff09; 一、思路&#xff1a; 1、首先自定义注解&#xff1b; 2、创建拦截器实现类&#xff08;自定义类名称&#xff09;&#xff0c;拦截器&#xff08;HandlerInterceptor&#xff09;; 3…...

Excel中将文本格式的数值转换为数字

在使用excel时&#xff0c;有时需要对数字列进行各种计算&#xff0c;比如求平均值&#xff0c;我们都知道应该使用AVERAGE()函数&#xff0c;但是很多时候结果却“不尽如人意”。 1 问题&#xff1a; 使用AVERAGE函数&#xff1a; 结果&#xff1a; 可以看到单元格左上角有个…...

uni-app开发小程序中遇到的map地图的点聚合以及polygon划分区域问题

写一篇文章来记录以下我在开发小程序地图过程中遇到的两个小坑吧&#xff0c;一个是点聚合&#xff0c;用的是joinCluster这个指令&#xff0c;另一个是polygon在地图上划分多边形的问题&#xff1a; 1.首先说一下点聚合问题&#xff0c;由于之前没有做过小程序地图问题&#…...

【笔记】软件测试的艺术

软件测试的心理学和经济学 测试是为发现错误而执行程序的过程&#xff0c;所以它是一个破坏性的过程&#xff0c;测试是一个“施虐”的过程。 软件测试的10大原则 1、测试用例需要对预期输出的结果有明确的定义 做这件事的前提是能够提前知晓需求和效果图&#xff0c;如果不…...

配置本地maven

安装maven安装包 修改环境变量 vim ~/.bash_profile export JMETER_HOME/Users/yyyyjinying/apache-jmeter-5.4.1 export GOROOT/usr/local/go export GOPATH/Users/yyyyjinying/demo-file/git/backend/go export GROOVY_HOME/Users/yyyyjinying/sortware/groovy-4.0.14 exp…...

C# 按钮的AcceptButton和CancelButton属性

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...

SMT贴片制造:专业、现代、智能的未来之选

在现代科技的快速发展下&#xff0c;SMT贴片制造作为电子元器件的核心工艺之一&#xff0c;正以其专业、现代和智能的特点成为未来的首选。 随着电子产品越来越小型化&#xff0c;传统的手工焊接已经无法满足高速、高精度、高稳定性的要求。而SMT贴片制造作为一种先进的表面贴…...

python sqlalchemy db.session 的commit()和colse()对session中的对象的影响

实验一&#xff1a;commit&#xff08;&#xff09;之后查看stu的属性id,查看db.session是否改变 db_test.route("/db_test",methods["GET"]) def db_test():stuStuTest()stu.stu_age22stu.stu_name"nnannns"stu.stu_class11print("sessio…...

python读取图像小工具

一、和图像交互获得图像的坐标和像素值 import cv2 import numpy as np import signal import threading import timeif __name__ __main__:img cv2.imread(XXX,0)#读取图片font_face,font_scale,thicknesscv2.FONT_HERSHEY_SIMPLEX,0.5,1#鼠标交互def mouseHandler(event,x…...

【ES6】JavaScript中Reflect

Reflect是JavaScript中的一个内建对象&#xff0c;它提供了一组方法&#xff0c;用于对对象和函数进行操作和检查。这些方法与内建对象的方法非常相似&#xff0c;但具有更高的灵活性。 以下是Reflect对象的一些常用方法&#xff1a; 1、Reflect.apply(target, thisArgument,…...

Ajax + Promise复习简单小结simple

axios使用 先看看老朋友 axios axios是基于Ajaxpromise封装的 看一下他的简单使用 安装&#xff1a;npm install axios --save 引入&#xff1a;import axios from axios GitHub地址 基本使用 axios({url: http://hmajax.itheima.net/api/province}).then(function (result…...

WebDAV之π-Disk派盘 + 小书匠

小书匠是一款功能丰富,强大的知识管理工具。全平台覆盖,离线数据存储,自定义数据服务器,所见即所得的 markdown 编辑体验。 小书匠提供了多种实用的编辑模式,例如:栏编辑、双栏编辑、三栏编辑、全屏写作、全屏阅读等。并且该软件还提供了许多有用的扩展语法,比如Latex公…...

LTE ATTACH流程、PDN流程、PGW地址分配介绍

1、S-GW\P-GW选择 MME根据S-GW和P-GW的拓扑信息进行S-GW/P-GW的选择&#xff0c;在S-GW的候选序列和P-GW的候选序列中比较&#xff0c;寻找是否有合一的S-GW/P-GW&#xff0c;并且根据S-GW的优先级和权重信息进行排序&#xff0c;得到S-GW/P-GW的候选组。 2、SGW>PGW连接 PD…...

SQL sever中用户管理

目录 一、用户管理常见方法 二、用户管理方法示例 2.1. 创建登录账户&#xff1a; 2.1.1 检查是否创建账户成功&#xff1a; 2.2. 创建数据库用户&#xff1a; 2.2.1检查用户是否创建成功&#xff1a; 2.3. 授予权限&#xff1a; 2.3.1授予 SELECT、INSERT 和 U…...

linux————pxe网络批量装机

目录 一、概述 什么是pxe pxe组件 二、搭建交互式pxe装机 一、配置基础环境 二、配置vsftpd 三、配置tftp 四、准备pxelinx.0文件、引导文件、内核文件 一、准备pxelinux.0 二、准备引导文件、内核文件 五、配置dhcp 一、安装dhcp 二、配置dhcp 六、创建default文…...

给嵌入式Web服务器加个“胃”:手把手教你用lwIP-2.1.3的httpd处理POST表单数据(含内存管理避坑)

嵌入式Web服务器的"消化系统"&#xff1a;lwIP-2.1.3 POST数据处理深度解析 在资源受限的嵌入式设备中实现Web表单交互&#xff0c;就像为设备安装了一个精密的"消化系统"。这个系统需要高效处理来自外部的数据"营养"&#xff0c;同时避免因&quo…...

iPaaS厂商:五家主流集成平台的技术与市场观察

在数字化转型的深水区&#xff0c;企业级集成平台即服务&#xff08;iPaaS&#xff09;正在成为IT架构的“神经系统”。国内外众多厂商纷纷布局&#xff0c;形成了从全域智能集成到轻量SaaS连接的多极化格局。本文基于公开资料&#xff0c;对五家具有代表性的iPaaS厂商及其核心…...

避坑指南:在ArcGIS中提取DEM高程点,为什么导入Global Mapper后看不到高度?

避坑指南&#xff1a;ArcGIS与Global Mapper高程数据互操作的核心陷阱与解决方案 当你第一次将精心处理的DEM高程点从ArcGIS导入Global Mapper&#xff0c;期待看到起伏有致的三维地形时&#xff0c;却发现所有点都"躺平"在二维平面上——这种挫败感我深有体会。这不…...

2026企业招聘平台选择趋势:前程无忧成为多类型岗位招聘的重要平台

相比只聚焦某一类岗位或单一人群的招聘平台&#xff0c;前程无忧更像一个覆盖企业全生命周期招聘需求的“综合人才生态平台”。从基层岗位招聘&#xff0c;到中高端人才寻访&#xff1b;从校园招聘&#xff0c;到灵活用工与AI智能匹配&#xff0c;前程无忧正在凭借28年行业积累…...

当 SpringBoot 请求踏上“七层之旅”:OSI 模型与你的每一行代码

你在 Controller 里写了一个 GetMapping&#xff0c;浏览器敲下回车&#xff0c;数据就回来了。 可你有没有想过&#xff0c;这短短几十毫秒里&#xff0c;你的数据经历了多少次“变装”和“安检”&#xff1f; 从 HTTP 报文到 TCP 段&#xff0c;再到 IP 包、以太网帧——每一…...

Java 数组

Java 数组详细教程数组是 Java 中一种基本且重要的数据结构&#xff0c;用于存储固定大小的同类型元素的集合。所有元素在内存中是连续存储的&#xff0c;可以通过索引&#xff08;下标&#xff09;快速访问。1. 数组的基本概念元素&#xff1a; 数组中存储的每一个数据项。长度…...

创业团队如何利用taotoken多模型能力快速进行产品原型验证

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 创业团队如何利用Taotoken多模型能力快速进行产品原型验证 对于资源有限的创业团队而言&#xff0c;开发一个智能对话产品原型时&a…...

宏裕塑胶代理新日铁住金日本工程塑料全系列产品服务详解

宏裕塑胶代理新日铁住金系列产品专注于为制造业企业提供高性价比、稳定可靠的通用工程塑料原料&#xff0c;依托源头直采及技术赋能&#xff0c;为塑胶制品厂、汽车零部件厂等客户降低采购成本并保障全流程供应。宏裕塑胶代理新日铁住金核心功能与服务模块覆盖多个维度&#xf…...

5分钟快速上手SignTools:自托管iOS应用签名平台完整教程

5分钟快速上手SignTools&#xff1a;自托管iOS应用签名平台完整教程 【免费下载链接】SignTools ✒ A free, self-hosted platform to sideload iOS apps without a computer 项目地址: https://gitcode.com/gh_mirrors/si/SignTools 想要在iOS设备上自由安装第三方应用…...

从莱顿瓶到手机:一个300年前的“水罐”如何塑造了今天的电子世界?

从莱顿瓶到手机&#xff1a;一个300年前的“水罐”如何塑造了今天的电子世界&#xff1f; 1746年&#xff0c;法国物理学家诺莱特在巴黎科学院进行了一场令人瞠目的公开实验&#xff1a;700名僧侣手拉手排成1.5公里长的人链&#xff0c;当首尾两端连接莱顿瓶时&#xff0c;所有…...