数据流的中位数 - LeetCode 热题 76

大家好!我是曾续缘😙

今天是《LeetCode 热题 100》系列

发车第 76 天

堆第 3 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

数据流的中位数

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

  • 例如 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
难度:💝💝💝

解题方法

这个题目要求我们实现一个数据流的中位数 finder,即 MedianFinder 类。该类需要维护一个数据流,并能快速地找到目前为止所有元素的中位数。

因为中位数把数据分成两个大小相等的集合,其中一个集合的数都小于等于中位数,另一个集合的数都大于等于中位数。如果数据量为偶数,则是两个数把数据分成两个大小相等的集合,中位数就是两个数的平均。

我们使用两个优先队列来维护数据流,一个用来维护小于等于中位数的集合(命名为 l),另一个用来维护大于等于中位数的集合(命名为 r),我们该使用大根堆还是小根堆?

如果中位数在l集合中,那它就是l集合的最大值,因此l集合使用大根堆。

如果中位数在r集合中,那它就是r集合的最小值,因此r集合使用小根堆。

有了两个堆之后,我们需要时刻保证中位数在堆顶,也就是说lr集合的数量需要尽可能平均。

1. MedianFinder 类的初始化

MedianFinder() 初始化 MedianFinder 对象。这里我们使用两个优先队列,一个用于存储较大的数(命名为 r),另一个用于存储较小的数(命名为 l)。

class MedianFinder {PriorityQueue<Integer> l; // 用于存储较小的一半PriorityQueue<Integer> r; // 用于存储较大的一半public MedianFinder() {l = new PriorityQueue<Integer>((a, b) -> (b - a));r = new PriorityQueue<Integer>();}// ... 其他方法
}

2. addNum 方法

void addNum(int num) 将数据流中的整数 num 添加到数据结构中。这个方法是这个类的主要方法,确保了数据流的中位数可以被快速找到。

  • 如果 l 是空的,或者 num 小于等于 l 的顶部元素,那么 num 会被加入到 l 中。
  • 然后,如果 l 的数量大于 r 的数量加 1,那么 l 的顶部元素会被转移到 r 中,以保证 l 和 r 的数量接近。
  • 如果 num 大于 l 的顶部元素,那么 num 会被加入到 r 中。
  • 然后,如果 r 的数量大于 l 的数量,那么 r 的顶部元素会被转移到 l 中。
    这样,我们就可以确保 l 和 r 的数量相差不超过 1,而中位数就是 l 的顶部元素(如果 l 的数量大于 r 的数量)或者 l 和 r 顶部元素的平均值(如果 l 和 r 的数量相等)。
public void addNum(int num) {// 如果 l 是空的,或者 num 小于等于 l 的顶部元素if(l.isEmpty() || num <= l.peek()){l.offer(num);// 如果 l 的数量大于 r 的数量加 1if(l.size() > r.size() + 1){// 将 l 的顶部元素转移到 rr.offer(l.poll());}}else{// 如果 num 大于 l 的顶部元素r.offer(num);// 如果 r 的数量大于 l 的数量if(r.size() > l.size()){// 将 r 的顶部元素转移到 ll.offer(r.poll());}}
}

3. findMedian 方法

double findMedian() 返回到目前为止所有元素的中位数。这个方法直接利用了 l 和 r 的性质来找到中位数。

  • 如果 l 的数量大于 r 的数量,那么中位数就是 l 的顶部元素。
  • 如果 l 和 r 的数量相等,那么中位数就是 l 和 r 顶部元素的平均值。
public double findMedian() {// 如果 l 的数量大于 r 的数量if(l.size() > r.size()){// 中位数就是 l 的顶部元素return l.peek();}// 如果 l 和 r 的数量相等return (l.peek() + r.peek()) / 2.0;
}

这样,我们就完成了一个 MedianFinder 类的实现,它可以在数据流中快速找到中位数。

Code

class MedianFinder {PriorityQueue<Integer> l;PriorityQueue<Integer> r;public MedianFinder() {l = new PriorityQueue<Integer>((a, b) -> (b - a));r = new PriorityQueue<Integer>((a, b) -> (a - b));}public void addNum(int num) {if(l.isEmpty() || num <= l.peek()){l.offer(num);if(l.size() > r.size() + 1){r.offer(l.poll());}}else{r.offer(num);if(r.size() > l.size()){l.offer(r.poll());}}}public double findMedian() {if(l.size() > r.size()){return l.peek();}return (l.peek() + r.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();*/

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

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

相关文章

Deploy Tomcat for Centos 7

介绍 Tomcat 是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。 Tomcat 是Apache软件基金会&#xff08;Apache Software Foundation&…

空压机的热回收原理介绍

空压机运行时会产生大量的压缩热&#xff0c;通常这部分能量通过机组的风冷或水冷系统释放到大气当中。压缩机的热回收是持续降低空气系统损耗&#xff0c;提高客户生产力的必要手段。 余热回收的节能技术目前研究很多&#xff0c;但大多只针对喷油螺杆式空压机的油路改造而言…

笔试---C++

1.class和struct的默认权限分别是什么&#xff1f; class:private struct:public 2.const和static的作用&#xff0c;说的越多越好 const的了解-CSDN博客 static的了解-CSDN博客 3.c语言中链表 struct node{ int value; struct node * next; } typedef struct node node…

Eureka全面解析:轻松实现高效服务发现与治理!

一、引言 Eureka是Netflix开源的一款服务发现框架&#xff0c;它提供了一种高效的服务注册和发现机制&#xff0c;适用于大规模分布式系统。本文将详细介绍Eureka的相关知识。 二、Eureka简介 Eureka是一个基于REST的服务发现框架&#xff0c;它提供了一种简单的服务注册和发…

如果创办Google

本文是一篇演讲稿&#xff0c;来自于《黑客与画家》一书的作者保罗*格雷厄姆&#xff0c;被称为硅谷创业之父。这是他为14至15岁的孩子们做的一次演讲&#xff0c;内容是关于如果他们将来想创立一家创业公司&#xff0c;现在应该做些什么。很多学校认为应该向学生们传授一些有关…

父子组件传值

&#xff08;1&#xff09;子组件通过prop接受父组件通过v-bind传递过来的值 &#xff08;2&#xff09;遵循单向数据流的原则&#xff0c;只能在父组件对值进行修改&#xff0c;子组件不可以对父组件中值进行修改 &#xff08;3&#xff09;在子组件通过$emit自定义事件将想要…

ADS基础教程15 - 设计加密保护IP

设计加密保护IP 一、引言二、IP的生成与调用1.IP生成2.IP的调用 一、引言 介绍如何ADS中如何对设计好的原理图进行加密形成IP&#xff0c;然偶进行调用的过程。 二、IP的生成与调用 1.IP生成 (1)选择一个已经调试好的原理图&#xff0c;在菜单栏中选择Tools–>Encode De…

2024-05-27 服务器开发-轻量级c++日志-实现

摘要: 2024-05-27 服务器开发-轻量级c日志-实现 logger.h #ifndef HDLOG_H #define HDLOG_H#pragma once#ifdef _WIN32 #include <windows.h> #include <io.h> #else //#include <chrono>#include <sys/time.h>#include <memory> #include <…

python中import的搜索路径

文章目录 前言 一 python中import的搜索路径1. python中import的搜索路径先判断是否内置模块根据sys.path查找1.1 脚本当前目录和所属项目目录1.2 环境变量1.3 标准库1.4 .pth 文件1.5 第三方库 2. 解决ModuleNotFoundError 前言 码python时经常会遇到找不到包或者找不到模块的…

【杂记-利用TCP协议传输数据始末详解】

一、三次握手前&#xff1a; 1、使用TCP协议的原因 TCP协议的目的是为了保证数据能在两端准确、连续的传输。 2、实现多设备传输的基础 TCP协议可使一个设备能同时与多个设备交互信息&#xff0c;它必须要保证不同传输通道之间不会产生串联或相互影响&#xff0c;所以TCP使用S…

OpenWrt 23.05 安装之后默认空间小 磁盘扩容 教程 软路由实测 系列六

1 安装fdisk opkg update opkg install fdisk #查看磁盘 rootOpenWrt:~# fdisk -l GPT PMBR size mismatch (246303 ! 250069679) will be corrected by write. The backup GPT table is not on the end of the device. Disk /dev/sda: 119.24 GiB, 128035676160 bytes, 25006…

SpringCloud配置文件bootstrap不生效问题解决

解决方案&#xff1a; 情况一、SpringBoot 版本 小于 2.4.0 版本&#xff0c;添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…

开源远程协助:分享屏幕,隔空协助!

&#x1f5a5;️ 星控远程协助系统 &#x1f5b1;️ 一个使用Java GUI技术实现的远程控制软件&#xff0c;你现在就可以远程查看和控制你的伙伴的桌面&#xff0c;接受星星的指引吧&#xff01; 支持系统&#xff1a;Windows / Mac / Linux &#x1f31f; 功能导览 &#x1f…

java-求质数问题

在 Java 中求质数是一个经典的问题&#xff0c;它可以很好地展示编程技巧和数学知识。质数是只有两个正因数&#xff1a;1 和它本身的数。例如&#xff0c;2、3、5、7、11、13 等都是质数。在计算机科学中&#xff0c;质数有着广泛的应用&#xff0c;比如在密码学、公共密钥加密…

521源码-免费源码下载-免费学习教程-常见的原生js封装ajax

更多 网站源码 学习教程 游戏源码&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源 请看以下案例&#xff1a; function ajax(options) {var xhr null;var type GET;var params formsParams(options.data);if(typeof options.type ! undefined){type o…

【Flutter】KeyAnimatedList组件

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月28日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

10个最佳人物素材网站推荐,免费获取第一个PNG文件!

人物素材是设计中应用最广泛的元素之一。无论是网页设计还是移动终端设计&#xff0c;人物素材的插画设计都比文字信息更容易吸引用户的注意力。作为内容呈现&#xff0c;还可以增加设计的艺术属性。为了节省大家寻找人物素材的时间成本&#xff0c;本文立即为大家整理了10个宝…

Java 实验12 线程同步与通信

&#xff08;一&#xff09;实验目的 1、掌握JAVA中多线程的实现方法&#xff1b; 2、重点掌握多线程的同步与通信机制&#xff1b; 3、熟悉JAVA中有关多线程同步与通信的方法 &#xff1b; 4、能使用多线程机制解决实际应用中的线程同步与通信问题。 &#xff08;二&…

202305青少年软件编程(Python)等级考试试卷(四级)

第 1 题 【单选题】 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头 小母牛。问第n 年的时候, 共有多少头母牛? 由递推法可推测, 当年数小于等于 4 的时候, 第几年就是有几头牛, 即 a[1]=1; a[2]=2; a[3]=3; a[4]=4。 当 n 大于 …

行为设计模式之职责链模式

文章目录 概述原理代码实现小结 概述 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止. 在职责链模式中&…