1. 题目描述

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

2. 思路

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

3. 代码

  1. import java.util.PriorityQueue;
  2. import java.util.Comparator;
  3. public class Solution {
  4. //小顶堆
  5. private PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
  6. //大顶堆
  7. private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {
  8. @Override
  9. public int compare(Integer o1, Integer o2) {
  10. return o2 - o1;
  11. }
  12. });
  13.  
  14. //记录元素个数偶数个还是奇数个
  15. int count = 0;
  16. public void Insert(Integer num) {
  17. /**个数为偶数的话,则先插入到大顶堆,然后将大顶堆中最大的数插入小顶堆中*/
  18. //保证了先放入小根堆,在放入大根堆
  19. if(count % 2 == 0){
  20. maxHeap.offer(num);
  21. int max = maxHeap.poll();
  22. minHeap.offer(max);
  23. }else{
  24. /**个数为奇数的话,则先插入到小顶堆,然后将小顶堆中最小的数插入大顶堆中*/
  25. minHeap.offer(num);
  26. int min = minHeap.poll();
  27. maxHeap.offer(min);
  28. }
  29. /**插入一个,数量增加一个*/
  30. count++;
  31. }
  32. public Double GetMedian() {
  33. if(count % 2 == 0){
  34. /**当前为偶数个,则取小顶堆和大顶堆的堆顶元素求平均*/
  35. return new Double(minHeap.peek() + maxHeap.peek())/2;
  36. }else{
  37. /**当前为奇数个,则直接从小顶堆中取元素即可*/
  38. return new Double(minHeap.peek());
  39. }
  40. }
  41. }

剑指offer:数据流中的中位数(小顶堆+大顶堆)的更多相关文章

  1. 剑指Offer——数据流中的中位数

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

  2. 剑指Offer-62.数据流中的中位数(C++/Java)

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

  3. 剑指offer--47.数据流中的中位数

    时间限制:1秒 空间限制:32768K 热度指数:122511 算法知识视频讲解 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如 ...

  4. 剑指offer64 数据流中的中位数

    priority_queue优先级队列,他的模板声明带有三个参数,priority_queue<Type, Container, Functional> Type 为数据类型, Conta ...

  5. 剑指Offer——网易笔试之解救小易——曼哈顿距离的典型应用

    剑指Offer--网易笔试之解救小易--曼哈顿距离的典型应用 前言 首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走 ...

  6. 力扣 - 剑指 Offer 54. 二叉搜索树的第k大节点

    题目 剑指 Offer 54. 二叉搜索树的第k大节点 思路1 二叉搜索树的特性就是中序遍历结果为递增序列,而题目要求的是第 k 大节点,所以就应该是要遍历结果为降序, 按照先遍历左子树.输出节点.遍 ...

  7. 剑指 Offer —— 数组中重复的数字

    数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...

  8. 剑指offer 数组中重复的数

    在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{ ...

  9. 剑指Offer28 最小的K个数(Partition函数应用+大顶堆)

    包含了Partition函数的多种用法 以及大顶堆操作 /*********************************************************************** ...

  10. 剑指Offer——数组中出现次数超过一半的数字——一题多解

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

随机推荐

  1. 《Spring Cloud微服务 入门 实战与进阶》

    很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...

  2. 用OC基于链表实现链队列

    一.简言 在前面已经用C++介绍过链队列的基本算法,可以去回顾一下https://www.cnblogs.com/XYQ-208910/p/11692065.html.少说多做,还是上手撸代码实践一下 ...

  3. IT兄弟连 Java语法教程 数据类型3

    字符型 在Java中,用于存储字符串的数据类型是char.然而,C/C++程序员要当心:Java中的char与C或C++中的char是不同的.在C/C++中,char的宽度是8位.而在Java中不是这 ...

  4. 如何将Javaweb工程的访问协议由http改为https及通过域名访问?

    将javaweb工程的http访问协议更改为https,需要做一下几部操作: 通过jre生成证书 调整tomcat的配置 调整工程的web.xm配置 具体详细过程如下: 一.生成证书 打开cmd切换到 ...

  5. 分词 | 双向匹配中文分词算法python实现

    本次实验内容是基于词典的双向匹配算法的中文分词算法的实现.使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法. 算法描述正向最大匹配算法先设定扫描的窗口大小ma ...

  6. okhttp浅析

    转载自:http://www.ishenping.com/ArtInfo/69561.html 1.okhttp工作的大致流程 1.1.整体流程 (1).当我们通过OkhttpClient创建一个Ca ...

  7. Redis for OPS 03:数据安全与持久化

    写在前面的话 通过前两节,除了安装部分,其它的更多的是作为了解,除非我们面向实际的开发,当然知道更多总是好的,这样才有吹牛逼的资本. 从本节开始我们主要谈谈作为一个运维,在处理 Redis 的维护的时 ...

  8. vscode wsl git 换行符问题autocrlf

    wsl中使用code,由于windows换行符问题git会显示大量文件修改,此时需要在wsl中设置autocrlf设置 git config --global core.autocrlf input ...

  9. efcore dotnet cli add-migrations update-database

    add-migrations update-database 如何通过dotnet cli调用 dotnet tool install --global dotnet-ef dotnet ef mig ...

  10. Razor_06 列表的查询

    Razor_06 列表的查询 列表的查询 同步/AJAX 查询 分局部视图[强类型] system.text.Json  Ajax 返回 Json 数据 , System.Text.Json .循环引 ...