数据流中的中位数

有一个数据流一直输入字符,用insert方法插入数据,用另一个方法获得中位数。这个题的做法就是构建堆结构,一个为最小堆,一个为最大堆,因为数组的长度是变化的,所以直接用优先级队列吧。
插入之后保证最小堆的数全部大于最大堆,且两边数目不能相差超过1。所以如果现在个数为偶数,则下一个插入最大堆,那怎么保证此时插入的数据小于全部的最小堆呢,就是先把数据插入最小堆,返回堆顶之后再插入最大堆。如果此时个数为奇数,说明上一个一定插入的是最大堆,则现在要插入最小堆,怎么做和上面类似
获得中位数的时候就是如果个数为奇数返回最小堆堆顶,如果个数为偶数,则返回两个堆顶之和,注意这里返回的时候要先利用new Double变成double类型之后再除以2。
此时得到中位数的复杂度为O(1),插入复杂度为O(logn)

import java.util.PriorityQueue;
import java.util.Comparator;
public class Solution {PriorityQueue<Integer> smallP=new PriorityQueue<Integer>((Integer a,Integer b)->{return a-b;});//其实默认就是小顶堆,试一下拉姆达表达式  PriorityQueue<Integer> bigP=new PriorityQueue<Integer>(new Comparator<Integer>(){public int compare(Integer a,Integer b){return b-a;}});int count=0;public void Insert(Integer num) {if((count&1) ==1){smallP.offer(num);num=smallP.poll();bigP.offer(num);count++;}else{bigP.offer(num);num=bigP.poll();smallP.offer(num);count++;}}public Double GetMedian() {if((count&1) ==1){//因为插的时候是如果为偶数则插到小顶堆,所以弹出也是小顶堆.return new Double(smallP.peek());}else{return new Double(bigP.peek()+smallP.peek())/2;}}}

双堆1.数据流的中位数相关推荐

  1. 堆实战(动态数据流求top k大元素,动态数据流求中位数)

    动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可当来的元素(newCome)> 堆顶元素(smallTo ...

  2. LeetCode 295. 数据流的中位数(大小堆)

    文章目录 1. 题目 2. 大小堆解题 1. 题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 ...

  3. 一道简约而不简单的算法题——数据流的中位数 | 附动画解析

    作者 | 程序员小吴 转载自微信公众号(ID:CXYxiaowu) 题目来源于 LeetCode 上第 295 号问题:数据流的中位数.难度级别为 Hard,目前通过率为 33.5% . 题目描述 中 ...

  4. 295. 数据流的中位数

    295. 数据流的中位数 欢迎大家参加每日一题系列并提供其他版本,在你也可以按照相同格式提供你的最新的每日一题题解. 每日一题系列 题目描述: 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是 ...

  5. Leetcode 295. 数据流的中位数

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

  6. LeetCode 295. 数据流的中位数 Hard难度

    295. 数据流的中位数 题目: 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 ...

  7. [LeetCode][C++]数据流的中位数

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

  8. R语言使用epiDisplay包的aggregate.plot函数可视化每个子集的汇总统计信息(可视化基于双变量分组下的中位数及其95%置信区间、病例组和对照组的差异)、lwd参数自定义线条的粗细宽度

    ↵ R语言使用epiDisplay包的aggregate.plot函数可视化每个子集的汇总统计信息(可视化基于双变量分组下的中位数及其95%置信区间.基于线图可视化病例组和对照组的差异).lwd参数自 ...

  9. 76. Leetcode 295. 数据流的中位数 (堆-技巧一-固定堆)

    技巧一 - 固定堆这个技巧指的是固定堆的大小 k 不变,代码上可通过每 pop 出去一个就 push 进来一个来实现.而由于初始堆可能是0,我们刚开始需要一个一个 push 进堆以达到堆的大小为k,因 ...

最新文章

  1. webpack4.0打包优化策略(二)
  2. 翻译: Oralce官方文档-- Data Blocks, Extents, and Segments
  3. mysql 执行计划不对_关于mysql主从查询执行计划不一致问题的分析
  4. linux ubuntu fadora,两大主流Linux版本Ubuntu 18.04和Fedora 28的对比
  5. Scala入门到精通——第二十四节 高级类型 (三)
  6. acwing2041. 干草堆(差分数组)
  7. jstring转换到C语言所用的char
  8. mysql基础之日志管理(查询日志、慢查询日志、错误日志、二进制日志、中继日志、事务日志)...
  9. 一位全减器逻辑电路图_一种一位全减器电路的制作方法
  10. 龙蜥开发者说:我眼里的龙蜥社区:一个包容的大家庭 | 第 10 期
  11. 飞翔 noip提高组难度
  12. 【Linux c】sipc
  13. linux下光模块信息命令,华为交换机查看光模块信息命令
  14. 基于qt linux的视频监控,基于Qt和OpenCV的无线视频监控系统
  15. 03.先了解一些python的基础语法
  16. Tensorlow 中文API:tf.zeros() tf.ones()tf.fill()tf.constant()
  17. TP5 在西部数码虚拟主机下 要如何实现伪静态
  18. ChatGPT所代表的人工智能的意义
  19. QTableView和QTableWidget的区别是什么?
  20. 查询客户时,提示“查询已超出200行,请限制查询“

热门文章

  1. 详细了解 Android 巧用 flexboxLayout 布局
  2. 为什么要学数学、语文?还有英语!
  3. Excel中的快捷实用操作
  4. 三星支付存在漏洞可导致黑客进行交易劫持
  5. 开放API接口整合多元办公能力,企业微信助IT企业打造高效办公平台
  6. sspanel php,sspanelv3魔改版邮件设置指南及常用配置
  7. 大学计算机网课怎么上,大学计算机课程学习路线应该是怎么样的呢?
  8. linux 安装 zookeeper
  9. 【易代账】凭证保存的时候提示sql执行错误
  10. vba 添加outlook 签名_outlook2007使用vba签名的问题