作者 | 程序员小吴

转载自微信公众号(ID:CXYxiaowu)

题目来源于 LeetCode 上第 295 号问题:数据流的中位数。难度级别为 Hard,目前通过率为 33.5% 。

题目描述

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。

  • double findMedian() - 返回目前所有元素的中位数。

示例:

addNum(1)addNum(2)findMedian() -> 1.5addNum(3) findMedian() -> 2

输入:


输出:

题目解析

这道题给我们一个数据流,让我们找出中位数。对于数据流这种动态(流动)的数据,如果使用数组存储,那么每次新进来一个数据都进行排序的话,效率很低。

处理动态数据来说一般使用的数据结构是栈、队列、二叉树、堆。

本题中,我们使用 堆 这种数据结构。

首先将数据分为两部分,位于 上边最大堆 的数据要比 下边最小堆 的数据都要小。

为了保证将数据平均分配到两个堆中,在动态的操作的过程中两个堆中数据的数目之差不能超过 1。

为了保证 最大堆中的所有数据都小于最小堆中的数据,在操作过程中,新添加进去的数据需要先和最大堆的最大值或者最小堆中的最小值进行比较。

动画描述


代码实现


class MedianFinder {    public PriorityQueue<Integer> minheap, maxheap;    public MedianFinder() {        //维护较大的元素的最小堆        maxheap = new PriorityQueue<Integer>(Collections.reverseOrder());        //维护较小元素的最大堆        minheap = new PriorityQueue<Integer>();    }

    // Adds a number into the data structure.    public void addNum(int num) {        maxheap.add(num);        minheap.add(maxheap.poll());        if (maxheap.size() < minheap.size()) {            maxheap.add(minheap.poll());        }    }

    // Returns the median of current data stream    public double findMedian() {        if (maxheap.size() == minheap.size()) {            return (maxheap.peek() + minheap.peek()) * 0.5;        } else {            return maxheap.peek();        }    }};

(本文为AI科技大本营转载文章,转载请联系原作者)

实习生招募

推荐阅读:

  • 详解爱奇艺ZoomAI视频增强技术的应用 | 公开课笔记

  • DOTA2人机决战:2:0!OpenAI击败世界冠军OG

  • Python的10个“秘籍”,这些技术专家全都告诉你了

  • 从头构建恶性肿瘤检测网络 | 100行Python代码理解深度学习关键概念

  • 马云再谈 996:真正的 996 与被剥削无关

  • 漫画:图的 “最短路径” 问题 | 技术头条

  • 从 0 到管理 200 人,这位程序员是如何做到的? | 程序员有话说

  • 4000万假币流入波场, 发生在凌晨的BTT假币攻击事件始末及细节披露

  • 程序员为什么都爱穿冲锋衣?(最全总结)

❤点击“阅读原文”,查看更多精彩文章。

一道简约而不简单的算法题——数据流的中位数 | 附动画解析相关推荐

  1. 【算法精讲】分享一道很不错的算法题

    戳蓝字"CSDN云计算"关注我们哦! 技术头条:干货.简洁.多维全面.更多云计算精华知识尽在眼前,get要点.solve难题,统统不在话下! 作者:帅地 转自:苦逼的码农 分享一道 ...

  2. 算法精讲:分享一道值得分享的算法题

    分享一道leetcode上的题,当然,居然不是放在刷题贴里来讲,意味着分享的这道题不仅仅是教你怎么来解决,更重要的是这道题引发出来的一些解题技巧或许可以用在其他地方,下面我们来看看这道题的描述. 问题 ...

  3. 啊这,一道数组去重的算法题把东哥整不会了…

    学算法认准 labuladong 东哥带你手把手撕力扣???? 点击下方卡片即可搜索???? 想啥呢?labuladong 怎么可能被整不会?只是东哥又发现了一个有趣的套路,所以写了篇文章分享给大家~ ...

  4. leetcode:一道清华考研专业课算法题

    贪心算法: class Solution {public int maxSubArray(int[] nums) {int Ret = nums[0],sum =0;for(int i =0;i< ...

  5. LeetCode算法题127:单词接龙解析

    给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 1.每次转换只能改变一个字母. 2.转换过 ...

  6. 安卓系统开发要学linux!算法题+JVM+自定义View,实战解析

    开头 笼统来说,中年程序员容易被淘汰的原因其实不外乎三点. 1.输出能力已到顶点.这个人奋斗十来年了,依旧碌碌无为,很明显这人的天花板就这样了,说白了,天赋就这样. 2.适应能力越来越差.年纪大,有家 ...

  7. 电子电路期末考试复习预测题一(内附详细解析)

    电子电路期末考试复习预测题(一) 目录 电子电路期末考试复习预测题(一) 复习题一 试题库(1)直流电路 试题库(2)直流电路 试题库(3)暂态电路 复习题一 试题库(1)直流电路 三.单项选择题 1 ...

  8. 2018 拼多多校招贪心算法题

    题目描述 六一儿童节,老师带了很多好吃的巧克力到幼儿园.每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i] (即w[j]>=h[i]),他才会上去表演节目.老师的目 ...

  9. 经典算法题:寻找数组中第k大的元素

    这算是一道相当经典的算法题了: 在长度为N的乱序数组中寻找第k(n>=k)大的元素. 扩展思考:如何处理数组中的重复元素?比如,对于数组a={1,2,2,2,3,3,3},第二大的元素应该是3还 ...

最新文章

  1. 安卓桌面软件哪个好_安卓模拟器哪个比较好?
  2. 3157 Java vs C++模拟
  3. [ATF]-ATF makefile的导读
  4. CSS3 Animation制作飘动的浮云和星星效果
  5. HTTP VS RPC
  6. hyperworks2017安装教程
  7. 【JavaWeb】Response请求转发与重定向辨析
  8. ie浏览器速度提升设置 关闭网页多媒体方法
  9. 数据库-MySQL中间的注释
  10. python中scrapy加请求头_Python爬虫之scrapy框架随机请求头中间件的设置
  11. postgre 主键_PostgreSQL – 随机主键
  12. vue组件(将页面公用的头部组件化)
  13. 微信服务号、订阅号和企业号的差别
  14. android逆向基础教程一
  15. JAVA计算机毕业设计中药分类管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  16. 以云服务器产品为例,深度分析比对华为云、阿里云、腾讯云
  17. wps右下角弹窗广告(WPS购物或叫WPS热点)彻底关闭
  18. java订单 并发_订单并发处理思路
  19. P5030 长脖子鹿放置
  20. AE教程丨1分钟学会制作信号故障风特效

热门文章

  1. 黄聪:穿过主机访问虚拟机中的SQL服务 FOR VMware NAT
  2. 自动驾驶安全框架开发进展综述
  3. Ubuntu 18.04安装中文输入法
  4. 暑期集训1:C++STL 练习题E:POJ-2431
  5. 2018/5/1-----1987年图灵奖PPT
  6. 2018.09.01 poj3071Football(概率dp+二进制找规律)
  7. python day two,while
  8. Uva 11400 - Lighting System Design (DP)
  9. 20169211 2016-2017-2 《移动平台开发实践》 第十周实验总结
  10. NEFU 1146 又见A+B