leetcode热题100.数据流的中位数

news/2024/5/20 6:29:26 标签: leetcode, 算法, , 数据结构, python

作者:晓宜
🌈🌈🌈
个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者
❤️❤️❤️
你的关注是我前进的动力😊

Problem: 295. 数据流的中位数

文章目录

  • 题目
  • 思路
  • Code

题目

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

  • 例如 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

提示:

− 1 0 5 < = n u m < = 1 0 5 -10^5 <= num <= 10^5 105<=num<=105

在调用 findMedian 之前,数据结构中至少有一个元素

最多 5 ∗ 1 0 4 5 * 10^4 5104 次调用 addNum 和 findMedian

思路

我们维护两个,一个最大,一个最小,最大维护小于等于中位数的值,最小维护大于中位数的数。

如果我们输入的数的总个数是奇数,那么我们的最大就会多一个数,其顶就是我们想要的中位数;

否则两个的元素个数就是相等的,我们的答案就是最大和最小顶元素的和的二分之一。

在代码实现方面,我们要通过最大和最小的元素个数来维护两个的元素,具体的逻辑判断请看代码

Code

python">class MedianFinder:

    def __init__(self):
        self.queMin = list()
        self.queMax = list()

    def addNum(self, num: int) -> None:
        queMin_ = self.queMin
        queMax_ = self.queMax

        if not queMin_ or num <= -queMin_[0]:
            heapq.heappush(queMin_, -num)
            if len(queMax_) + 1 < len(queMin_):
                heapq.heappush(queMax_, -heapq.heappop(queMin_))
        else:
            heapq.heappush(queMax_, num)
            if len(queMax_) > len(queMin_):
                heapq.heappush(queMin_, -heapq.heappop(queMax_))
        
    def findMedian(self) -> float:
        queMin_ = self.queMin
        queMax_ = self.queMax

        if len(queMin_) > len(queMax_):
            return -queMin_[0]
        return (-queMin_[0] + queMax_[0]) / 2

http://www.niftyadmin.cn/n/5467620.html

相关文章

基于springboot的宠物健康咨询系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的宠物健康咨询系统,java…

MATLAB 打开文件对话框选择点云输入 (52)

MATLAB 打开文件对话框选择点云输入 (52) 一、算法介绍二、算法实现1.代码一、算法介绍 从指定的路径中(具体的文件夹),选择指定的文件格式(比如ply文件),读取手动点击选择的点云。 整个过程通过打开资源管理器的对话框来手动点击选择点云读取。直接运行即可。 二、算…

Git合并分支rebase和merge区别

Git可视化工具下载&#xff1a;Git - GUI Clients 合并前分支&#xff1a; Merge之后的结果&#xff1a; rebase之后的结果&#xff1a; 1 Git分支合并rebase和merge区别 merge工作原理&#xff1a;假如在master分支上因为业务需要临时拉出个分支叫dropdown&#xff0c;现在…

开源项目advcpmv实现cp/mv显示进度条 —— 筑梦之路

项目地址&#xff1a;https://github.com/jarun/advcpmv 1. 查看当前系统上的包版本 rpm -qa | grep -w coreutils 2. 下载8.32版本的源码包 wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.32.tar.xz 3. 下载对应版本的补丁包 wget https://github.com/jarun/advcpm…

24-Web服务核心功能有哪些,如何实现?

在Go项目开发中&#xff0c;绝大部分情况下&#xff0c;我们是在写能提供某种功能的后端服务&#xff0c;这些功能以RPC API 接口或者RESTful API接口的形式对外提供&#xff0c;能提供这两种API接口的服务也统称为Web服务。 Web服务的核心功能 将这些功能分成了基础功能和高…

【Python基础知识点】Python的浅拷贝和深拷贝

概述 本文主要通过两个简单的代码小例子理解深拷贝和浅拷贝 主体内容 copy 模块提供了浅拷贝和深拷贝的功能。它的主要函数有: copy(x): 返回对象 x 的浅拷贝。 deepcopy(x): 返回对象 x 的深拷贝。 浅拷贝使用 copy(x) 函数,它只复制了最外层的对象,但内层的对象仍然是引用…

前端实现菜单搜索搜索(功能模版)

目录 前言正文 前言 总体界面如下所示&#xff1a; 正文 <template><div class"avue-searchs"click.self"handleEsc"><div class"avue-searchs__title">菜单搜索</div><div class"avue-searchs__content"…

保持ssh断开后,程序不会停止执行

保持ssh断开后&#xff0c;程序不会停止执行 一、前言 笔者做远程部署搞了一阵子&#xff0c;快结项时发现一旦我关闭了ssh连接窗口&#xff0c;远程服务器会自动杀掉我在ssh连接状态下运行的程序。 这怎么行&#xff0c;岂不是想要它一直运行还得要一台电脑一直打开ssh连接咯…