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

【LeetCode】剑指 Offer 41. 数据流中的中位数 p214 -- Java Version

题目链接:https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof

1. 题目介绍(41. 数据流中的中位数)

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

例如
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。
  • double findMedian() - 返回目前所有元素的中位数。

【测试用例】:
示例 1:

输入
[“MedianFinder”,“addNum”,“addNum”,“findMedian”,“addNum”,“findMedian”]
[[],[1],[2],[],[3],[]]
输出:[null,null,null,1.50000,null,2.00000]

示例 2:

输入
[“MedianFinder”,“addNum”,“findMedian”,“addNum”,“findMedian”]
[[],[2],[],[3],[]]
输出:[null,null,2.00000,null,2.50000]

【条件约束】:

限制

  • 最多会对 addNum、findMedian 进行 50000 次调用。

【相关题目】:

注意:本题与主站 295. 数据流的中位数 题目相同。

2. 题解

2.1 最大堆和最小堆(原书题解) – O(logn)

时间复杂度O(logn),空间复杂度O(n)
偶数情况:
在这里插入图片描述

解题思路】:
该题的解法很多,可以通过数组、链表、二叉搜索树、AVL树、最大堆和最小堆来实现,目前最推荐的就是使用 最大堆和最小堆 来解决该问题。该题可以将整个数据容器分成两部分,左边部分的数据要比右边的数据小。我们可以用一个最大堆实现左边的数据容器,用一个最小堆实现右边的数据容器。
两个保证

  1. 要保证数据平均分配到两个堆中,两个堆中数据的数目之差不能超过1;
  2. 要保证最小堆中的所有数据都要大于最大堆中的数据

……
实现策略】:

  1. 使用优先队列 PriorityQueue 实现最大堆和最小堆,优先队列的底层实现是一个最小堆,通过重写比较器的方法,可以将其改为大根堆;
    更多内容可参考:堆的实现(Java)
  2. 分配数据的插入位置,如果数据的总数目是 偶数,则把新数据插入到 小根堆,否则则插入到 大根堆
  3. 保证堆中数据正确,即小根堆中所有数据都要大于大根堆中的数据,因此就要进行判断,如果出现了要插入小根堆中的数据小于大根堆中的数据的情况,那么则将该数据插入到大根堆,并将大根堆的队首元素(最大值)弹出插入到小根堆中;
  4. 返回中点时进行判断,如果总数是偶数,则返回中点两数的平均值,如果是奇数,则返回小根堆的最小值。

……
注意点】:

  1. == 运算符的优先级要大于 & 运算符:
    在这里插入图片描述
    因此,在判断总数目是偶数时要注意加上括号:((minHeap.size() + maxHeap.size()) & 1) == 0,挺麻烦的就是说,但如果你不加括号,就会出现下列问题:
    在这里插入图片描述
    更多内容可参考:Java运算符优先级
class MedianFinder {// 最小堆 PriorityQueue<Integer> minHeap;// 最大堆PriorityQueue<Integer> maxHeap;/** initialize your data structure here. */public MedianFinder() {minHeap = new PriorityQueue<>();maxHeap = new PriorityQueue<>((i1, i2) -> Integer.compare(i2, i1));}public void addNum(int num) {// 如果总数目是偶数,则将数据存到小根堆if (((minHeap.size() + maxHeap.size()) & 1) == 0){if (maxHeap.size() > 0 && num < maxHeap.peek()){maxHeap.offer(num);minHeap.offer(maxHeap.poll());}else minHeap.offer(num);} else{ // 否则存到大根堆if (minHeap.size() > 0 && minHeap.peek() < num){minHeap.offer(num); maxHeap.offer(minHeap.poll()); }else maxHeap.offer(num);}}public double findMedian() {// 总数是偶数,返回两数平均值if (((minHeap.size() + maxHeap.size()) & 1) == 0){return (double)(minHeap.peek() + maxHeap.peek())/2;}else{ // 奇数,返回小根堆return minHeap.peek();}}
}/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder obj = new MedianFinder();* obj.addNum(num);* double param_2 = obj.findMedian();*/

在这里插入图片描述
代码简化:

简化思路】:
思路与上面差不多,只不过是简化省略了一些判断过程,直接将判断的过程扔给了堆,如:我要向大根堆插入一个数据,那么我就先要插入的数据扔到小根堆中,然后我把小根堆中最小的数插入大根堆,反之亦然,这样始终能保持小根堆存储较大一半、大根堆存储较小一半。
在这里插入图片描述

class MedianFinder {Queue<Integer> A, B;public MedianFinder() {A = new PriorityQueue<>(); // 小顶堆,保存较大的一半B = new PriorityQueue<>((x, y) -> (y - x)); // 大顶堆,保存较小的一半}public void addNum(int num) {if(A.size() != B.size()) {A.add(num);B.add(A.poll());} else {B.add(num);A.add(B.poll());}}public double findMedian() {return A.size() != B.size() ? A.peek() : (A.peek() + B.peek()) / 2.0;}
}

在这里插入图片描述

3. 参考资料

[1] 面试题41. 数据流中的中位数(优先队列 / 堆,清晰图解)

相关文章:

【LeetCode】剑指 Offer 41. 数据流中的中位数 p214 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof 1. 题目介绍&#xff08;41. 数据流中的中位数&#xff09; 如何得到一个数据流中的中位数&#xff1f;如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位…...

CSS3 知识总结

1&#xff0c;什么是CSS 用于定义网页的样式&#xff0c;包括不同设备和屏幕尺寸的设计、布局和显示变化。 2&#xff0c;CSS的作用优点 CSS 描述 HTML 元素如何在屏幕、纸张或其他媒体上显示 CSS 节省了大量工作。它可以一次控制多个网页的布局 3&#xff0c;css构成 CSS 规…...

回溯算法37:解数独

主要是我自己刷题的一些记录过程。如果有错可以指出哦&#xff0c;大家一起进步。 转载代码随想录 原文链接&#xff1a; 代码随想录 leetcode链接&#xff1a;37. 解数独 题目&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则…...

【蓝桥杯-筑基篇】动态规划

&#x1f353;系列专栏:蓝桥杯 &#x1f349;个人主页:个人主页 目录 1.最大连续子段和 2.LCS 最大公共子序列 3.LIS 最长上升子序列 4.数塔 5.最大子矩阵和 6.背包问题 ①01背包问题 ②完全背包 1.最大连续子段和 这段代码是一个求最大子数组和的算法&#xff0c;使用…...

Unity利用Photon PUN2框架快速实现多人在线游戏实例分享

简介 Photon 是一个泛用性的 ScoketServer 套装软件,可用于多人在线游戏、聊天室、大厅游戏,并同时支持 Windows、Unity3D、iOS、Android、Flash 等平台。Photon 包含两个部分,一部分是 Socket 服务器,另一部分是其针对各个平台编写的 SDK,Unity3D 平台对应的 SDK 为 Pho…...

ChatGPT直出1.5w字论文查重率才30% - 基于物联网技术的智能家居控制系统设计与实现

文章目录ChatGPT直出1.5w字论文查重率才30% - 基于物联网技术的智能家居控制系统设计与实现一、绪论1.1 研究背景与意义1.2 国内外研究现状分析1.3 研究内容与目标1.4 研究方向和思路二、物联网技术与智能家居概述2.1 物联网技术原理与应用2.2 智能家居的概念与发展历程2.3 智能…...

特斯拉的操作系统是用什么语言编写的?

总目录链接>> AutoSAR入门和实战系列总目录 文章目录特斯拉车辆操作系统特斯拉GitHub中使用的语言Ruby和GoPythonSwift 和 Objective CQt我们知道操作系统至少需要一些非常低级的代码&#xff0c;这些代码在系统首次启动时运行&#xff0c;必须使用接近硬件的语言编写。…...

C++学习8-C++提高编程

文章目录前言一、模板1.1 模板的概念1.2 函数模板1.2.1 函数模板语法1.2.2 函数模板注意事项1.2.3 函数模板案例复习&#xff1a;计算数组长度1.2.4 普通函数与函数模板的区别1.2.5 普通函数与函数模板的调用规则1.2.6 模板的局限性1.3 类模板1.3.1 类模板语法1.3.2 类模板与函…...

ubuntu安装git server

一安装 要在Ubuntu上安装Git服务器,需要按照以下步骤进行操作: 安装Git: sudo apt-get update sudo apt-get install git 创建一个Git用户和一个Git仓库目录: sudo adduser git sudo mkdir /home/git/repo.git sudo chown git:git /home/git/repo.git 初始化Git仓库: c…...

物流云数据分析平台

物流云数据分析服务平台 http://project.webcats.cn/bx/36569/2455/index.html 本次系统模拟的是湖南省数据&#xff0c;解释权归杭氏集团所有&#xff01; 1、系统简介: 物流大数据集成展示系统旨在通过大屏幕全面显示指定地区的物流运营车辆、物流公司和货主的相关信息和…...

配置OBS存储功能、新搭建obs

通过应用开发环境与OBS&#xff08;Object-based Storage Service&#xff09;对接&#xff0c;实现对象或者Widget资产存储功能。 背景信息 对象存储服务&#xff08;Object-based Storage Service&#xff0c;OBS&#xff09;是一个基于对象的海量存储服务&#xff0c;为客…...

基于DPDK收包的suricata的安装和运行

操作系统版本&#xff1a;Ubuntu 20.04.5 suricata版本&#xff1a; suricata-7.0.0-rc1 suricata是一个基于规则的入侵检测和防御引擎&#xff0c;功能强大&#xff0c;但性能可能 差强人意&#xff0c;不过目前最新的7版本已经支持DPDK收包了&#xff0c;DPDK是Intel提供的高…...

浅谈23种设计模式

创建型模式 有5种设计模式 抽象工厂&#xff08;Abstract Factory&#xff09;&#xff1a;多套方案 抽象工厂模式是对创建不同的产品类型的抽象。对应到工作中&#xff0c;我们的确应该具备提供多套方案的能力&#xff0c;这也是我们常说的&#xff0c;要提供选择题。当你有这…...

JetBrains Rider 2022.3.3 Crack

具有 ReSharper 强大功能的令人难以置信的 .NET IDE&#xff01;Rider 在我们使用 Windows 和 macOS 的整个开发团队中使用。 什么是骑士&#xff1f; JetBrains Rider 是一个基于 IntelliJ 平台和 ReSharper 的跨平台 .NET IDE。 支持许多 .NET 项目类型 JetBrains Rider 支持…...

浅理解扁平数据结构转Tree(树形结构)

文章目录&#x1f4cb;前言&#x1f3af;扁平数据结构&#x1f3af;树形数据结构&#x1f3af;使用递归将扁平数据转换为树形数据&#x1f4dd;最后&#x1f4cb;前言 在前端开发中&#xff0c;我们经常需要将扁平数据结构转换为树形结构&#xff08;Tree&#xff09;。比如在…...

前端开发——JavaScript的条件语句

世界不仅有黑&#xff0c;又或者白 世界而是一道精致的灰 ——Lungcen 目录 条件判断语句 if 语句 if else 语句 if else if else 语句 switch语句 break 关键字 case 子句 default语句 while循环语句 do while循环语句 for循环语句 for 循环中的三个表达式 for 循环嵌套 for …...

2.11 循环赛日程表

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 目录 书本内容&#xff1a; 我的理解&#xff1a; 更优化的算法&#xff1a; 总结 1.注意实现问题 2.当用C语言和C实现循环赛日程表算法时&#xff…...

SpringBoot——SB整合mybatis案例(残缺版本)第三集

了解完使用阿里云存储的操作后&#xff0c;现在需要在案例里面集成阿里云进行开发。云服务——阿里云OSS的入门使用_北岭山脚鼠鼠的博客-CSDN博客 阿里云OSS——集成 对于前端传过来的图片要先上传到OSS&#xff0c;然后获取图片在云端的访问地址&#xff0c;存储到数据库里面…...

Baumer工业相机堡盟相机不满帧如何使用CameraExplorer设置相机参数让它的帧率达到满帧

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…...

巴黎爱情回忆 NFT 作品集

由 Metaverse Studio 制作。 欢迎来到浪漫之都巴黎&#xff01;尽情游览美丽壮观的地标&#xff0c;探索法国文化。在离开之前&#xff0c;别忘了从《巴黎爱情回忆》NFT 作品集中带走一件纪念品。从世界著名的法国人物到标志性资产&#xff0c;这些 NFT肯定会为您的钱包带来巴黎…...

openai开放gpt3.5-turbo模型api,使用python即可写一个基于gpt的智能问答机器人

1安装python库 使用pip安装openai库&#xff0c;注意gpt3.5-turbo模型需要python>3.9的版本支持&#xff0c;本文演示的python版本是python3.10.10 pip install openai2创建api key 需要提前在openai官网上注册好账号&#xff0c;然后打开https://platform.openai.com/ac…...

GUI开发--LCD屏幕的使用(非第三方库)--笔记

导&#xff1a;界面交互需要GUI&#xff0c;GUI需要文字和图片&#xff0c;所有此处总结在M4芯片上实现GUI的基本操作&#xff01;该芯片具有160K大小的内存&#xff0c;有512K的flash&#xff1b;故而没有使用第三方库&#xff01; LCD屏幕的使用--笔记 1.汉字显示-两种方式…...

CesiumForUnreal实现地形等高线效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 具体过程3.参考资料1.实现目标 在UE5中使用CesiumForUnreal插件添加Cesium World Terrain在线的世界地形,然后以25米为等高距,绘制一定范围内的等高线,如下图所示: 2.实现过程 由于这里直接使用CesiumForUnreal插件加载的在…...

Python爬虫——Python Selenium基本用法

Selenium 作为一款 Web 自动化测试框架&#xff0c;提供了诸多操作浏览器的方法&#xff0c;这里对其中的常用方法做详细介绍。 定位节点 Selenium 提供了 8 种定位单个节点的方法&#xff0c;如下所示&#xff1a; 定位节点方法方法说明find_element_by_id()通过 id 属性值定…...

仿真与测试:单元测试与Test Harness

本文描述单元测试的概念&#xff0c;以及Test Harness建立的方法和简单的单元测试过程。 文章目录1 单元测试1.1 场景举例1.2 简单的测试方法2 Test Harness建立2.1 模型配置2.2 创建Test Harness3 总结1 单元测试 单元测试&#xff0c;简单来说就是在Simulink模型中只测试一小…...

面试常问集锦——MySQL部分

Mysql速成大法 请签收MySQL灵魂十连 https://mp.weixin.qq.com/s?__bizMzI4NjI1OTI4Nw&mid2247488721&idx1&sneead82d2b7a0fdf993beacc4dfd60313&chksmebdef5e9dca97cff9d638877e5855850727ae26ebcfd60c7700ae53e311fa6ddb64b63bb9552&scene178&cur_a…...

算法训练第四十四天|完全背包理论 、518. 零钱兑换 II、377. 组合总和 Ⅳ

第九章 动态规划part06完全背包理论基础完全背包C测试代码总结518. 零钱兑换 II题目描述思路总结377. 组合总和 Ⅳ题目描述思路总结完全背包理论基础 参考&#xff1a;https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%…...

0x06多层感知机

感知机 感知机形象的来看就是我们接触过的一个只有两个部分组成&#xff08;输出和输入&#xff09;组成的最简单的神经网络之一。 给定输入x&#xff0c;权重w和偏移b以及一个感知函数&#xff0c;感知机就能输出&#xff1a; 这个函数可以形象的用作二分类问题&#xff0c;…...

HTML是什么?HTML简介

HTML 英文全称是 Hyper Text Markup Language&#xff0c;中文译为“超文本标记语言”&#xff0c;专门用来设计和编辑网页。 使用 HTML 编写的文件称为“HTML 文档”&#xff0c;一般后缀为.html&#xff08;也可以使用.htm&#xff0c;不过比较少见&#xff09;。HTML 文档是…...

Linux定时服务

目录 1、定时器操作 2.cron表达式的语法规则 参考链接 1、定时器操作 sudo crontab -e 【选择2】 进入进行配置【需要按下 i 】 #sh /home/xx/crontabsh/test.sh的意思是&#xff0c;让sh解释器调用test.sh脚本&#xff0c;到达定时执行任务的效果 # 每一分钟执行一次 *…...