leetcode剑指offer41:数据流中的中位数

Java实现 LeetCode 295 数据流的中位数 295. 数据流的中位数 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示... 阅读详情

题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
例如,
[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]
思路1:
维护一个数组,每次以快排的方式,重新进行排序,然后按照中位数的计算方式返回值即可。
时间复杂度即为O(NlogN)。

class MedianFinder:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.nums = []
        self.length = 0


    def addNum(self, num: int) -> None:
        self.nums.append(num)
        self.length += 1


    def findMedian(self) -> float:
        if self.length == 0:
            return 0
        self.nums.sort()
        if self.length % 2 == 1:
            return self.nums[self.length//2]
        else:
            return (self.nums[self.length//2] + self.nums[self.length//2 - 1])/2

# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()

思路2:
来源于优秀题解
使用两个堆来完成,A堆存储数组中数较大的一半,B堆存储数组中值较小的一半。
A用一个小顶堆实现,这样堆顶的元素就是较大数中,最小的一个;
B用一个大顶堆实现,这样堆顶的圆度就是较小数中,最大的一个;
特殊地,当总数N是偶数时,A和B各村N/2个数;当总数N是奇数时,A存N//2+1个,B存N//2个。

在加入一个新的数的时候,
如果此时A和B的数量相同,先把数加入到B中,然后把B的顶给A;
如果此时A和B的数量不相同,先把数加入到A中,然后把A的顶给B。

需要注意的是,在python中heapq 模块是小顶堆。实现 大顶堆 方法: 小顶堆的插入和弹出操作均将元素 取反 即可。

from heapq import *

class MedianFinder:
    def __init__(self):
        self.A = [] # 小顶堆,保存较大的一半
        self.B = [] # 大顶堆,保存较小的一半

    def addNum(self, num: int) -> None:
        if len(self.A) != len(self.B):
            heappush(self.B, -heappushpop(self.A, num))
        else:
            heappush(self.A, -heappushpop(self.B, -num))

    def findMedian(self) -> float:
        return self.A[0] if len(self.A) != len(self.B) else (self.A[0] - self.B[0]) / 2.0
InTouch历史报警与操作记录高效查询控件V4.0实战指南(一键下载即用) 本文详细介绍了InTouch历史报警与操作记录高效查询控件V4.0的实战应用。该控件针对原生AlmDbViewCtrl控件的查询效率低下、功能单一等问题,提供了智能查询、可视化统计、视图定制和一键导出Excel等强大功能,旨在帮助工程师快速处理海量历史数据,大幅提升工控运维效率。 阅读详情

相关推荐

Benchmark系列——基本概念和分类

本文主要介绍了Benchmark的基本概念和分类情况。

Bluetangos的博客 8438

大根堆与小根堆(java,c++,python)

Java 使用可方便实现大顶堆。为大根堆,r为小根堆。

mirana的专栏 645

LVGL在RTOS下的线程安全实践:从卡死到流畅的界面切换

本文探讨LVGL在RTOS环境下的线程安全实践,重点分析FreeRTOS多任务同步机制,包括互斥锁、任务通知和消息队列方案。通过实际案例展示如何避免界面卡顿和系统死锁,实现从卡死到流畅的界面切换,为嵌入式GUI开发提供可靠的适配解决方案。

uran的专栏 1111

剑指Offer刷题笔记——数据流中的中位数

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 主要思想: 最大堆 | 最小堆 我们将数据分为两部分,位于左边最大堆的数据比右边最小堆的数据要小,左、右两边内...

七月听雪的博客 160

433M无线遥控器EV1527协议解码实战:从逻辑分析到代码优化

本文详细解析了433M无线遥控器EV1527协议的实战解码过程。从使用逻辑分析仪抓取波形、理解同步头与数据位编码原理开始,逐步深入代码实现。文章重点对比了原始定时器轮询法的痛点,并提出了基于“边沿捕获+时间戳”的优化方案,构建了高效、可移植且具备抗干扰能力的解码引擎,最后分享了跨平台移植的核心技巧。

weixin_29168813的博客 927

中小公司无线组网实战:用一台H3C AC和普通三层交换,实现办公网AP统一管理

本文详细介绍了中小型企业如何利用H3C AC控制器与普通三层交换机实现无线AP统一管理的实战方案。通过VLAN规划、DHCP配置和AC控制器设置,构建经济高效的办公网络,解决信号覆盖和连接稳定性问题,特别适合50-200人规模的企业部署。

weixin_42531516的博客 382

《剑指Offer(第二版)》面试题41. 数据流中的中位数

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 例如, [2,3,4]的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数...

今晚打老虎 267

Unity Shader实战:用Matcap给你的低模角色快速换上‘次世代’材质(附完整Shader代码)

本文详细介绍了Unity中Matcap技术的实战应用,通过Shader代码实现低模角色的次世代材质表现。Matcap技术利用预烘焙光照贴图,显著提升材质质感同时保持极低性能消耗,特别适合移动游戏和独立开发。文章包含完整Shader代码、平面模型着色优化方案及动态环境反射增强技巧,帮助开发者快速提升低模视觉效果。

weixin_28718755的博客 385

剑指 Offer 41. 数据流中的中位数 - LeetCode(力扣)

剑指 Offer 41. 数据流中的中位数 - LeetCode(力扣)

Onwaier的博客 427

在zcu102开发板上使用PetaLinux运行Qt程序

请注意,上述步骤只是一个概述,并且可能需要根据特定的开发环境和要求进行适当的调整。如果你是一个初学者或者对于这些领域不太熟悉,建议在尝试之前阅读相关的文档和教程,或者寻求专业人士的帮助。在"Projects"菜单中,选择"Build & Run"选项,并在"Build"步骤中选择正确的工具链。注意:如果Qt程序依赖于其他库文件,需要将这些库文件一起复制到PetaLinux工程的根文件系统目录中,并在Qt程序中正确地配置库文件路径。如果一切顺利,PetaLinux系统将启动,并自动运行Qt程序。

UhxzCombined的博客 698

数据资产可视化分析:PowerBI在大数据管理中的实战

目的:帮你搞懂“为什么数据资产需要可视化?”“PowerBI能帮企业解决什么问题?”,并掌握用PowerBI做大数据可视化的实战技巧。范围:覆盖数据资产定义、可视化分析原理、PowerBI核心功能(数据连接、建模、可视化)、零售企业实战案例,以及未来趋势与挑战。背景:为什么企业的数据像乱堆的玩具?核心概念:数据资产、可视化分析、PowerBI分别是什么?它们怎么配合?实战步骤:用PowerBI帮零售企业整理“销售玩具箱”,做出能指导决策的仪表盘;应用场景:不同部门怎么用这个“整理好的玩具箱”?

2501_92132293的博客 906

Leetcode 剑指 Offer 41. 数据流中的中位数

Leetcode 剑指 Offer 41. 数据流中的中位数 题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findM

weixin_43891775的博客 231

基于STM32的智能宠物喂食系统设计与实现(代码+PCB )

STM32;DHT11;本系统的软件程序基于Keil MDK-ARM V5集成开发环境进行编写和编译。Keil MDK是ARM公司官方推荐的嵌入式开发工具,支持ARM Cortex-M系列微控制器的程序开发,内置ARM C/C++编译器、调试器和仿真器,具有代码编辑、语法高亮、工程管理和在线调试等功能,是STM32开发领域应用最为广泛的IDE之一。

3254968421的博客 72

[leetCode]剑指 Offer 41. 数据流中的中位数

最大堆,最小堆  由于需要使用一个数据容器保存从数据流中得到的数据,那么对该容器插入数据与读取数据的时间复杂度有一定要求。  假设数据在容器中已排序,那么使用两个指针即可得到中位数,当数据量为奇数时p1,p2指向同一个数据。  如果数据量为偶数,p1指向左边最大数,p2指向右边最小数。 因此可以将数据分为两部分: 左半部分 右半部分 左半部分应小于等于右半部分。由于需要快速找到左半部分的最大数与右半部分的最小数,可以想到使用最大堆与最小堆。由于要保证左右两部分数据量之差不超过1,所以可以在数据总量.

Warms的博客 236

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LeetCode题解「 剑指 Offer 41 」:数据流的中位数

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 解题核心: 划重点了嗷,排序之后,数据流中间......有啥思路吗? 排序,位于中间,那便是由一个大根堆和一个小根堆组合成的对顶堆。 解题思路: 堆(Heap),是一种由数组或序列(其项的值在小根堆中必须满足且,在大根堆中必须满足且)构...

EthaneHike的博客 534

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LeetCode 剑指 Offer 41. 数据流中的中位数

目录结构 1.题目 2.题解 1.题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 例如, [2,3,4]的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() -.

HarvestWu的博客 305

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

剑指 Offer 41. 数据流中的中位数 - leetcode 剑指offer系列

题目难度: 困难 原题链接 今天继续更新剑指 offer 系列, 这道题有一定难度, 对应的思路也比较巧妙, 大家可以尝试挑战一下~ 老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ 另外在公众号里回复 offer 就能看到剑指 offer 系列当前连载的所有文章了 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 .

随便发挥的博客 221

LeetCode Python优秀题解——剑指 Offer 41. 数据流中的中位数

本系列旨在对比不同LeetCode的解题方法效率,占用空间等方面的区别,希望帮助大家能够精进代码水平,用更好的思维与方法去解题。其中的部分解题可能涉及代码的奇技淫巧,我回尽量给大家解释,我也会标注正常的思路至少应该达到何种水准,如果有更好的方法也请大家多多指教! 本系列的资源消耗数据由LeetCode给出,但是LeetCode的评价会有20ms左右的波动,这里列出的只是显示的最优成绩,但是直接复制这里的结果不一定能跑出同样的成绩。题目: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中

孤寂不及清夜长 319

leetcode295/剑指offer41.数据流的中位数

1.题目描述 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4]的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 ...

没有感情的刷题机器 345

【LeetCode】剑指 Offer 41. 数据流中的中位数

【LeetCode】剑指 Offer 41. 数据流中的中位数

2022年毕业的萌新程序猿,输出一下自己的学习内容~ 353

算法练习-排序 LeetCode 剑指 Offer 41. 数据流中的中位数

算法练习-排序 LeetCode 剑指 Offer 41. 数据流中的中位数

qq_41758969的博客 252

LeetCode 剑指 Offer 41. 数据流中的中位数—— JavaScript

题链接:https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/ 题描述: 解题思路: 利用数组存储数据并排序。 addNum(): (1)找出添加的数据在数组中合适的位置 (2)插入该数据 findMedian(): (1)如果数组长度为奇数,中位数等于数组中间的元素 (2)如果为偶数,则为中间两个数的平均值 代码实现: function(){ } ...

ySFRaabbcc的博客 276

(栈队列堆) 剑指 Offer 41. 数据流中的中位数 ——【Leetcode每日一题】

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

weixin_43412762的博客 231

JavaScript——leetcode剑指 Offer 41. 数据流中的中位数【排序专题】

题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示例 1: 输入:

Teresa的前端海底乐园 255

力扣 剑指 Offer 41. 数据流中的中位数

用一个最大堆,一个最小堆分别维护排序后的数据流的左右两部分,插入时如果两个堆中元素数量一样,那么我们规定始终往最大堆中添加元素(最小堆也行),但添加前我们要把该元素加入最小堆中,再从最小堆中取出堆顶元素加入最大堆中。插入时如果最大堆多一,就以相同的方法把元素加入到最小堆中 主要分析一下这种方法与单纯维护一个列表来说有什么优势 取中位数都是一样的O(1) 插入元素,在列表中需要O(logn)(列表是有序的)来寻找插入的下标,再O(n)来插入元素。而对于堆来说只需要O(logn)即可完成插入元素 ps:第一次.

eyvr的博客 231

【LeetCode】295. 数据流的中位数(同剑指Offer41)

一、题目 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操作的数据结构: void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。 示例: addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedi

HeavenDan的博客 336
上一篇: leetcode 剑指offer 45:把数组排成最小的数
下一篇: leetcode剑指offer68:二叉(搜索)树的最近公共祖先
coding_diamond
博客等级 码龄8年 8粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值