1. 题目描述

/**如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用 Insert()方法读取数据流,使用 GetMedian()方法获取当前读取数据的中位数。
*/

2. 思路

  /**  最大堆和最小堆* 每次插入小顶堆的是当前大顶堆中最大的数* 每次插入大顶堆的是当前小顶堆中最小的数* 这样保证小顶堆中的数永远大于等于大顶堆中的数(值)* 中位数就可以方便地从两者的根结点中获取了* 奇数的话 小根堆中的元素数 大于 大根堆中的元素数(数量)*/

3. 代码

import java.util.PriorityQueue;
import java.util.Comparator;
public class Solution {//小顶堆private PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();//大顶堆private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});//记录元素个数偶数个还是奇数个int count = 0;public void Insert(Integer num) {/**个数为偶数的话,则先插入到大顶堆,然后将大顶堆中最大的数插入小顶堆中*///保证了先放入小根堆,在放入大根堆if(count % 2 == 0){maxHeap.offer(num);int max = maxHeap.poll();minHeap.offer(max);}else{/**个数为奇数的话,则先插入到小顶堆,然后将小顶堆中最小的数插入大顶堆中*/minHeap.offer(num);int min = minHeap.poll();maxHeap.offer(min);}/**插入一个,数量增加一个*/count++;}public Double GetMedian() {if(count % 2 == 0){/**当前为偶数个,则取小顶堆和大顶堆的堆顶元素求平均*/return new Double(minHeap.peek() + maxHeap.peek())/2;}else{/**当前为奇数个,则直接从小顶堆中取元素即可*/return new Double(minHeap.peek());}}
}

转载于:https://www.cnblogs.com/haimishasha/p/11520748.html

剑指offer:数据流中的中位数(小顶堆+大顶堆)相关推荐

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

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

  2. 剑指offer——数据流中的中位数

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

  3. 剑指offer 矩阵中的路径 @python

    剑指offer 矩阵中的路径 @python 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...

  4. 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点

    [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...

  5. 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  6. 剑指Offer——网易笔试之解救小易

    知识要点 首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走AC和 CB才能到达,由于街道很规则,ACB就像一个直角3 ...

  7. 剑指Offer——链表中倒数第K个节点

    1.题目描述 输入一个链表,输出该链表中倒数第k个结点. 2.代码实现 package com.baozi.offer;/*** @author BaoZi* @create 2019-07-11-1 ...

  8. [剑指Offer]-矩阵中的路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...

  9. 剑指offer 数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  10. 剑指offer:矩阵中的路径

    题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某 ...

最新文章

  1. Django restful-framework初步学习
  2. 企业的覆灭,我监视你的Exchange邮件!
  3. 用了 10 年 Windows 后,我最终转向 Linux
  4. 如何看待雅虎套现760亿美元从阿里巴巴退出?
  5. POJ 1723 Soldiers (中位数)
  6. 王者荣耀服务器维护中有什么漏洞,王者荣耀:排位惊现漏洞,利用这个BUG一天上王者,三天登荣耀...
  7. eclipse alt+/ 无效时,如何设置 《转》
  8. Mathtype公式编辑器常用快捷键
  9. 控制面板中没有reltek高清晰音频管理器 插入耳机后仍然外放(已解决)
  10. php脚本暴力破解网站密码(附php源代码)
  11. Python学习笔记三之编程练习:循环、迭代器与函数
  12. 夏天宝宝晚上睡觉不踏实怎么办?
  13. 机器学习中的数学——常用概率分布(十一):狄利克雷分布(Dirichlet分布)
  14. ANDROID 开源库
  15. 花千芳口出狂言说英语没用,王思聪怒怼他!在线英语培训越来越重要!
  16. 关于Docker,你要知道的都在这了
  17. 安卓应用程序加密,签名和发布
  18. 以太坊闪电网络实现原理
  19. 绝地求生手游电脑版连接服务器没有响应,绝地求生电脑版进去为什么连接失败 | 手游网游页游攻略大全...
  20. Windows7和Windows10设置屏保保护程序-冒泡

热门文章

  1. 读取文本节点_TextRank抽取型文本摘要
  2. python 文件和目录基本操作_Python常用的文件及文件路径、目录操作方法汇总介绍...
  3. c语言中open函数r,C语言中open函数
  4. java steam 排序_Java使用Steams VS TreeMap对地图进行排序
  5. c语言入口参数和出口参数,麻烦帮忙指出一下这个函数的入口参数和出口参数呀!...
  6. linux怎么初始命令,linux 第二季 初始linux 目录以及初始命令
  7. 分布式系统原理_终于有架构大牛把分布式系统概念讲明白了,竟然用了足足800页...
  8. JAVA绘制图片原理_java开发_图片截取工具实现原理
  9. 安全戴尔服务器销售,PowerEdge T340
  10. mysql手动同步_MySql数据库主从手动同步