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

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

作者:晓宜
🌈🌈🌈
个人简介:互联网大厂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

class MedianFinder:def __init__(self):self.queMin = list()self.queMax = list()def addNum(self, num: int) -> None:queMin_ = self.queMinqueMax_ = self.queMaxif 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.queMinqueMax_ = self.queMaxif len(queMin_) > len(queMax_):return -queMin_[0]return (-queMin_[0] + queMax_[0]) / 2
http://www.lryc.cn/news/331038.html

相关文章:

  • C 从函数返回指针
  • (文章复现)考虑分布式电源不确定性的配电网鲁棒动态重构
  • 蓝桥杯第八届c++大学B组详解
  • 小于n的最大数 Leetcode 902 Numbers At Most N Given Digit Set
  • Leetcode刷题-数组(二分法、双指针法、窗口滑动)
  • STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)
  • 数据仓库——事实表
  • 人工智能常用的编程语言有哪些?
  • 【Leetcode每日一题】模拟 - 提莫攻击(难度⭐)(45)
  • OPPO云VPC网络实践
  • 力扣(数组)找到所有数组中消失的数字
  • 每日面经分享(Spring Boot: part3 Service层)
  • k8s的pod访问service的方式
  • shell脚本发布docker-nginx vue2 项目示例
  • 【THM】Nmap Basic Port Scans(基本端口扫描)-初级渗透测试
  • Groovy结合Java在生产中的落地实战
  • 达梦数据库 创建外部表 [-7082]:外部表数据错误.
  • XUbuntu22.04之激活Linux最新Typora版本(二百二十五)
  • JavaScript简介
  • 使用PaddleX实现的智慧农业病虫检测项目
  • 算法学习——LeetCode力扣图论篇1(797. 所有可能的路径、200. 岛屿数量、695. 岛屿的最大面积)
  • 【IP组播】PIM-SM的RP、RPF校验
  • 前端代码规范-命名规范
  • 移动端APP测试常见面试题精析
  • 报错[Vue warn]: $listeners is readonly. $attrs is readonly.怎么解决?
  • android 14 apexd分析(1)apexd bootstrap
  • C++ 中的 vector 的模拟实现【代码纯享】
  • UE4 方块排序动画
  • 网络与并发编程(一)
  • 超详细工具Navicat安装教程