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

例如,

  • [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]

限制

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

方法:优先队列

  • MedianFinder:

    • 我们创建两个优先队列,分别保存列表的一半:
    • 小顶堆,保存值较大的一半;
    • 大顶堆,保存值较小的一半;
  • addNum:

    • 为偶数时,向大顶堆中加入当前值,再将大顶堆的堆顶元素插入到小顶堆;
    • 为奇数时,向小顶堆中加入当前值,再将小顶堆的堆顶元素插入到大顶堆;
  • findMedian:

    • 为偶数时,中位数取两个堆顶元素之和除以2;
    • 为奇数时,中位数取小顶堆的堆顶元素。

代码如下:

复杂度分析

  • 时间复杂度:

    • addNum: O(logn),其中 n 为累计添加的数的数量。
    • findMedian: O(1)。
  • 空间复杂度:O(n),主要为优先队列的开销。

END

骐骥一跃,不能十步;驽马十驾,功在不舍;锲而舍之,朽木不折;锲而不舍,金石可镂,赠友人。

好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。

算法:数据流中的中位数相关推荐

  1. 数据结构与算法之字符凭拼接最低字典序和数据流中取中位数

    数据结构与算法之字符凭拼接最低字典序和数据流中取中位数 目录 字符凭拼接最低字典序 数据流中取中位数 1. 字符凭拼接最低字典序 题目描述 思路: 创建一个比较器,比较的内容是(o1+o2).comp ...

  2. Leetcode295 数据流中的中位数-最小堆和最大堆

    题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如,[2,3,4] 的中位数是 3:[2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两 ...

  3. 数据流中的中位数,我轻敌了

    前言 大家好,我是bigsai.最近轻敌了一个高频问题,分享给大家. 最近面试时候遇到一个非常有意思的hard题,面试官没让写代码让说思路,但放在正常应届生招聘那可能就要手撕了,在剑指offer的第4 ...

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

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

  5. 从数据流中获取中位数

    从数据流中获取中位数 需求描述 需求分析 C++代码如下 python代码 需求描述   有一个动态的数据流,如何比较快的获得数据流的中位数.这个过程中,数据流可能会有新的数据加入.中位数定义为元素个 ...

  6. 剑指offer:面试题41. 数据流中的中位数

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

  7. 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值

    一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...

  8. 《剑指offer》数据流中的中位数

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

  9. 牛客网 在线编程 数据流中的中位数

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

最新文章

  1. 题解 UVA10328 【Coin Toss】
  2. mac os 录屏快捷键_Mac跨平台自动同步记事本
  3. 使用Runnable配合Thread创建线程
  4. 【bfs】Replication G(P7151)
  5. vue新版router.addRoute基础用法
  6. 2018-2019-2 实验四 Android程序设计
  7. Java JavaBean
  8. HDOJ---1267 下沙的沙子2[DP或卡特兰数]
  9. wifi驱动总结(2)
  10. Rad Software Regular Expression Designer 正则表达式工具软件
  11. java毕业设计古典舞在线交流平台mybatis+源码+调试部署+系统+数据库+lw
  12. Microsoft Office XP 智能标记的安装和安全性
  13. odoo rest api 服务接口
  14. LSF - 集群概览
  15. 鼠标光标变成方块怎么办
  16. HCIA网络基础7-VRP和命令行基础
  17. 【HCNP-OSPF】LSA
  18. 【STM32】RTC实时时钟概述、寄存器、库函数(RTC一般步骤)
  19. 智能照明新的低成本解决方案?涂鸦 Beacon 智能灯泡初体验
  20. 删除字符串中的数字字符

热门文章

  1. 全球及中国左旋肉碱富马酸盐行业发展趋势与需求形势预测报告(2022-2027年)
  2. 【基础入门题072】转置矩阵
  3. python安装osgeo及shapefile库、is not a supported wheel on this platform 的问题
  4. 关于GPS坐标转换(一)
  5. visio使用小知识
  6. 天猫精灵 python 控制_天猫精灵的高阶玩法-控制我的电脑
  7. PHP检查端口是否可以被绑定
  8. MySQL 完全备份 + 增量备份+完全恢复
  9. colorAccent,colorPrimary,colorPrimaryDark做什么的?
  10. vue中this.$router.params接收传值为空咋办