算法通关村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;}}
}

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

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

相关文章

2023.9.1 简单认识 JVM

目录 JVM 内存划分 本地方法栈 虚拟机栈 程序计数器 堆区 元数据区 JVM 类加载机制 加载 验证 准备 解析 初始化 类被加载的几种情况&#xff08;懒汉模式 ---> 只要被用到才会被加载&#xff09; 双亲委派模型 JVM 内存划分 JVM 是一个应用程序&#xff0c;在…

用ChatGPT做一个Chrome扩展 | 京东云技术团队

用ChatGPT做了个Chrome Extension 最近科技圈儿最火的话题莫过于ChatGPT了。 最近又发布了GPT-4&#xff0c;发布会上的Demo着实吸睛。 笔记本上手画个网页原型&#xff0c;直接生成网页。网友直呼&#xff1a;前端失业了&#xff01; 但我觉着啊&#xff0c;真就外行看热闹…

JVM之堆和方法区

目录 1.堆 1.1 堆的结构 1.1.1 新生代&#xff08;Young Generation&#xff09; 1.1.2 年老代&#xff08;Old Generation&#xff09; 1.1.3 永久代/元空间&#xff08;Permanent Generation/Metaspace&#xff09; 1.2 堆的内存溢出 1.3 堆内存诊断 1.3.1 jmap 1.3.2…

Three.js添加阴影和简单后期处理

在Three.js中&#xff0c;可以使用渲染器的一些特性来实现阴影和后期处理效果。 添加阴影 要在Three.js中添加阴影效果&#xff0c;需要做以下几个步骤&#xff1a; 1.开启阴影 首先&#xff0c;要在渲染器中开启阴影&#xff1a; renderer.shadowMap.enabled true;2.设置…

minio文件服务器开启https

一、准备证书 你要有https安全证书&#xff0c;我的是适用于nginx的证书 私钥 xxxx.key 公钥 xxxx.pem 二、上传证书到minio服务器 然后看看你的minio docker 有没有把 /root/.minio 挂载在主机上&#xff0c;如果有那么把两个证书文件放在/root/.minio/certs目录里面。…

STM32启动模式详解

文章目录 前置知识1. 单片机最小系统组成2. BOOT电路3. 三种启动模式4. 存储器映射 从主FLASH启动从系统存储区启动从SRAM启动 前置知识 1. 单片机最小系统组成 一个单片机最小系统由电源、晶振、下载电路、BOOT电路、和复位电路组成。少一个单片机都启动不了。 2. BOOT电路 …

Linux基础(三)

一.系统基本优化 关闭selinux:getenforce 查看selinux状态setenforce 0 临时关闭vim /etc/sysconfig/selinux 永久关闭SELINUXdisabled 关闭防火墙&#xff1a;systemctl stop firewalld 临时关闭防火墙systemctl disable firewalld 永久关闭防火墙sys…

几种反序列化漏洞

1.PHP魔术方法 <?php class c {private $name hacker;function __construct() { // 构造方法&#xff0c;new时调用echo construct<br>;}function __serialize() { // 序列化时调用echo serialize<br>;return [hack];}function __unserialize($data) { // 反…

LeetCode-1005-K次取反后最大化的数组和-贪心算法

题目描述&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能的最大和 。 …

多源最短路径算法:Floyd-Warshall算法分析

文章目录 图的邻接矩阵 一.Floyd-Warshall算法思想(基于动态规划)二.Floyd-Warshall算法接口笔记附录:单源最短路径--Bellman-Ford算法1.Bellman-Ford算法接口核心部分2.Bellman-Ford算法接口 图的邻接矩阵 namespace Graph_Structure {//Vertex是代表顶点的数据类型,Weight是…

python二级选择题必备

输出带有引号的字符串&#xff0c;可以使用转义字符\ 可以使用datatype()测试字符串的类型(没有datatype) 程序员可以调整的是异常(Exception)&#xff0c;开发者调整的是错误(Error) 序列类型是二维元素向量(一维)、元素之间存在先后关系&#xff0c;通过序号访问 Python的…

three.js(九):内置的路径合成几何体

路径合成几何体 TubeGeometry 管道LatheGeometry 车削ExtrudeGeometry 挤压 TubeGeometry 管道 TubeGeometry(path : Curve, tubularSegments : Integer, radius : Float, radialSegments : Integer, closed : Boolean) path — Curve - 一个由基类Curve继承而来的3D路径。 De…

【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )

代码示例 : <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Banner 轮播</title><style>/* 取消浏览器或者其它标签的默认的内外边距 */* {margin: 0;padding: 0;}/* 取消列表样式 主要是…

【Java】基础入门(十七)--- 类

1. 类 Java有各种各样类&#xff0c;如&#xff1a;顶级类、嵌套类、内部类、成员类、局部类&#xff08;本地类&#xff09;、静态类、匿名类、文件类以及这些组合起来的称呼类&#xff0c;成员内部类&#xff0c;成员匿名类&#xff0c;成员嵌套类&#xff0c;匿名内部类等 1…

百万级并发IM即时消息系统(2)

1.用户model type UserBasic struct {gorm.ModelName stringPassWord stringPhone string valid:"matches(^1[3-9]{1}\\d{9}$)"Email string valid:"email"Avatar string //头像Identity stringClientIp s…

nepctf2023 部分web复现

目录 <1> EZJAVA_CHECKIN(shiro550) <2> 独步天下-转生成为镜花水月中的王者(环境变量提权) <3> 独步天下-破除虚妄_探见真实(Venom代理&ping%0a绕过rce&c文件描述符未关闭连接父进程修改文件权限) <4> 独步天下-破除试炼_加冕成王(tp6rceu…

【Go 基础篇】Go语言数组内存分析:深入了解内部机制

在Go语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储一系列相同类型的元素。虽然数组在应用中非常常见&#xff0c;但了解其在内存中的存储方式和分配机制仍然是一个重要的课题。本文将深入探讨Go语言数组的内存分析&#xff0c;揭示数组在内存中的布局和分配…

网络协议三要素

计算机语言作为程序员控制一台计算机工作的协议&#xff0c;具备了协议的三要素。 语法&#xff0c;就是这一段内容要符合一定的规则和格式。例如&#xff0c;括号要成对&#xff0c;结束要使用分号等。语义&#xff0c;就是这一段内容要代表某种意义。例如数字减去数字是有意…

PHP 面试 - 2023

文章目录 一、排序算法 原文链接1 排序算法2 二、设计模式 23种设计模式

【Hadoop】Hadoop入门概念简介

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…