当前位置: 首页 > 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肯定会为您的钱包带来巴黎…...

Flowframes:3分钟掌握Windows平台AI视频插帧完整指南

Flowframes&#xff1a;3分钟掌握Windows平台AI视频插帧完整指南 【免费下载链接】flowframes Flowframes Windows GUI for video interpolation using DAIN (NCNN) or RIFE (CUDA/NCNN) 项目地址: https://gitcode.com/gh_mirrors/fl/flowframes 你是否曾经观看24帧视频…...

三步搞定海量图片二维码识别:QrScan批量检测工具终极指南

三步搞定海量图片二维码识别&#xff1a;QrScan批量检测工具终极指南 【免费下载链接】QrScan 离线批量检测图片是否包含二维码以及识别二维码 项目地址: https://gitcode.com/gh_mirrors/qrs/QrScan 你是否曾经面对成千上万的图片文件&#xff0c;需要从中筛选出包含二…...

低成本PHY芯片RTL8201F驱动移植实战:从LAN8742到RTL8201F的完整替换流程与验证

低成本PHY芯片RTL8201F驱动移植实战&#xff1a;从LAN8742到RTL8201F的完整替换流程与验证 在嵌入式以太网开发中&#xff0c;PHY芯片的选择往往需要在性能和成本之间取得平衡。当项目预算有限时&#xff0c;RTL8201F这类低成本PHY芯片就成为极具吸引力的选择。本文将详细介绍如…...

美国不断自我革新的历史,为这个国家面对充满巨大机遇却又充满不确定性的未来提供了引人深思的经验教训

https://www.mckinsey.com/mgi/our-research/At-250-sustaining-Americas-competitive-edge 美国不断自我革新的历史&#xff0c;为这个国家面对充满巨大机遇却又充满不确定性的未来提供了引人深思的经验教训 这一切始于一场惊天动地的反抗行动。 1776年7月&#xff0c;来自13…...

Arm Neoverse CMN-700互连架构与协议寄存器配置指南

1. Arm Neoverse CMN-700一致性互连架构解析在现代多核处理器设计中&#xff0c;一致性互连网络如同城市交通系统般重要。Arm Neoverse CMN-700作为第二代Coherent Mesh Network解决方案&#xff0c;其架构设计充分考虑了数据中心和边缘计算的严苛需求。与传统的总线或环形拓扑…...

轻量级爬虫框架slacrawl:基于规则驱动的模块化数据采集实践

1. 项目概述&#xff1a;一个轻量级、模块化的网页爬虫框架最近在做一个需要从多个网站定时抓取结构化数据的小项目&#xff0c;找了一圈现成的工具&#xff0c;要么太重&#xff08;像Scrapy&#xff0c;学起来成本高&#xff09;&#xff0c;要么太死板&#xff08;很多脚本只…...

3分钟掌握Seraphine:英雄联盟智能助手完全指南

3分钟掌握Seraphine&#xff1a;英雄联盟智能助手完全指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine Seraphine是一款基于英雄联盟官方LCU API开发的智能游戏助手&#xff0c;通过自动BP系统和实时战绩查…...

使用mcp-maker快速构建AI工具集成服务器:从MCP协议到实践

1. 项目概述&#xff1a;一个为AI应用注入“超能力”的MCP服务器工厂 如果你最近在折腾AI应用开发&#xff0c;特别是想给ChatGPT、Claude这类大模型配上“手和脚”&#xff0c;让它们能操作你的本地文件、查询数据库&#xff0c;甚至控制你的智能家居&#xff0c;那你大概率已…...

从开源AI导师项目GURU-Ai拆解:如何构建具备教学能力的智能体

1. 项目概述&#xff1a;一个“AI导师”的诞生与定位最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Guru322/GURU-Ai”。光看名字&#xff0c;你可能会觉得这又是一个平平无奇的AI工具仓库。但点进去细看&#xff0c;你会发现它的野心不小——它想做的不是又一个聊天机…...

别再拷贝exe到NXBIN了!用批处理文件搞定NX二次开发外部exe的环境变量(附VS2015/NX12配置)

告别手动拷贝&#xff1a;用批处理智能管理NX二次开发环境变量 每次修改完NX二次开发的外部exe程序&#xff0c;都要手动拷贝到NXBIN目录&#xff1f;这种重复劳动不仅低效&#xff0c;还容易导致版本混乱。其实只需一个简单的批处理脚本&#xff0c;就能彻底解决环境变量配置问…...