剑指Offer(牛客网)-数据流中的中位数

2023-11-20

题目来源:

https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?tpId=13&tqId=11216&tPage=4&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述:

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

解题思路:

  • 先用java集合PriorityQueue来设置一个小顶堆和大顶堆
  • 主要的思想是:因为要求的是中位数,那么这两个堆,大顶堆用来存较小的数,从大到小排列
  • 小顶堆存较大的数,从小到大的顺序排序*,显然中位数就是大顶堆的根节点与小顶堆的根节点和的平均数。
  • 保证:小顶堆中的元素都大于等于大顶堆中的元素,所以每次塞值,并不是直接塞进去,而是从另一个堆中poll出一个最大(最小)的塞值
  • 当数目为偶数的时候,将这个值插入大顶堆中,再将大顶堆中根节点(即最大值)插入到小顶堆中;
  • 当数目为奇数的时候,将这个值插入小顶堆中,再讲小顶堆中根节点(即最小值)插入到大顶堆中;
  • 取中位数的时候,如果当前个数为偶数,显然是取小顶堆和大顶堆根结点的平均值;如果当前个数为奇数,显然是取小顶堆的根节点

代码如下:

import java.util.PriorityQueue;
import java.util.Comparator;

public class Solution {
    //小顶堆
    private PriorityQueue<Integer> minHeap = new PriorityQueue();
    //大顶堆
    private PriorityQueue<Integer> maxHeap = new PriorityQueue(15, new Comparator<Integer>() {
        public 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());
        }
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指Offer(牛客网)-数据流中的中位数 的相关文章

  • 剑指 offer (专项突击版)

    剑指 Offer II 001 整数除法 方法一 class Solution public int divide int a int b 考虑被除数为最小值的情况 if a INT MIN if b 1 return INT MIN if
  • 39_MoreThanHalfNumber 数组中超过一半的元素

    数组中有一个数字出现的次数超过数组长度的一半 请找出这个数字 你可以假设数组是非空的 并且给定的数组总是存在多数元素 示例 1 输入 1 2 3 2 2 2 5 4 2 输出 2 1 利用hashmap统计数组中元素出现的次数 如果次数大于
  • 剑指Offer 04. 二维数组中的查找

    原题链接 思路 题目中说 每一行都是 从左向右递增的 在一个递增的序列中 查找某个数是否是存在的 二分即可 注意对边界进行判断 时间复杂度 O nlogn 代码 class Solution public boolean check int
  • 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 -- 递归

    0 题目描述 leetcode原题链接 剑指 Offer 68 I 二叉搜索树的最近公共祖先 1 递归解法 终止条件 当 root 为空时 返回 None 当 p q 都在 root 的右子树中 则开启递归 root right 并返回 否
  • 有序单链表转换成二叉平衡搜索树

    题目 Given a singly linked list where elements are sorted in ascending order convert it to a height balanced BST 关键词 有序单链表
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。

    定义栈的数据结构 请在该类型中实现一个能够得到校的最小元素的min函数 在该栈中 调用pop push 及min的时间复杂度都是0 1 param
  • 【剑指Offer】35.复杂链表的复制(JS实现)

    题目描述 请实现 copyRandomList 函数 复制一个复杂链表 在复杂链表中 每个节点除了有一个 next 指针指向下一个节点 还有一个 random 指针指向链表中的任意节点或者 null 示例1 输入 head 7 null 1
  • 剑指 Offer 63. 股票的最大利润(java+python)

    假设把某股票的价格按照时间先后顺序存储在数组中 请问买卖该股票一次可能获得的最大利润是多少 示例 1 输入 7 1 5 3 6 4 输出 5 解释 在第 2 天 股票价格 1 的时候买入 在第 5 天 股票价格 6 的时候卖出 最大利润 6
  • 剑指 Offer 57. 和为s的两个数字(java+python)

    输入一个递增排序的数组和一个数字s 在数组中查找两个数 使得它们的和正好是s 如果有多对数字的和等于s 则输出任意一对即可 示例 1 输入 nums 2 7 11 15 target 9 输出 2 7 或者 7 2 示例 2 输入 nums
  • 剑指Offer-链表-面试题62:圆圈中最后剩下的数字

    面试题62 圆圈中最后剩下的数字 题目描述 每年六一儿童节 牛客都会准备一些小礼物去看望孤儿院的小朋友 今年亦是如此 HF作为牛客的资深元老 自然也准备了一些小游戏 其中 有个游戏是这样的 首先 让小朋友们围成一个大圈 然后 他随机指定一个
  • 剑指offer:中等部分

    剑指offer 中等部分 001 求1 2 n 求 1 2 n 要求不能使用乘除法 for while if else switch case等关键字及条件判断语句 A B C 示例 1 输入 n 3 输出 6 示例 2 输入 n 9 输出
  • 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。

    题目 定义栈的数据结构 请在该类型中实现一个能够得到栈中所含最小元素的min函数 时间复杂度应为O 1 分析 使用双栈实现 一个数据栈data 一个最小栈min 数据栈存正常入栈的元素 最小栈永远存数据栈中当前最小值 具体是依靠以下规则来实
  • 华为OD流程走完了

    我机试题地址 传送门 huaweiOD机试题 机试过了后 华为上海部HR一面 耗时30分钟左右 问了些家庭 个人工作经历 包括结婚否 为什么辞职之类的 技术二面 同样 自我介绍结束后 问了些项目相关的细节 该环节完后 面试官共享其试题 限时
  • JZ15 二进制中1的个数

    输入一个整数 n 输出该数32位二进制表示中1的个数 其中负数用补码表示 数据范围 2 31 lt n lt 2 31 1 231 lt n lt 231 1 即范围为 2147483648 lt n lt 2147483647 21474
  • 面试题13. 机器人的运动范围(java+python)

    地上有一个m行n列的方格 从坐标 0 0 到坐标 m 1 n 1 一个机器人从坐标 0 0 的格子开始移动 它每次可以向左 右 上 下移动一格 不能移动到方格外 也不能进入行坐标和列坐标的数位之和大于k的格子 例如 当k为18时 机器人能够
  • 【剑指Offer】(字符串)左旋转字符串(翻转操作)

    题目链接 https www nowcoder com practice 12d959b108cb42b1ab72cef4d36af5ec tpId 13 tqId 11196 tPage 1 rp 1 ru ta coding inter
  • 剑指 Offer 41. 数据流中的中位数(java+python)

    如何得到一个数据流中的中位数 如果从数据流中读出奇数个数值 那么中位数就是所有数值排序之后位于中间的数值 如果从数据流中读出偶数个数值 那么中位数就是所有数值排序之后中间两个数的平均值 例如 2 3 4 的中位数是 3 2 3 的中位数是
  • Acwing-27. 数值的整数次方

    由于本题的指数是int范围 可能很大 所以需要用快速幂 Acwing 875 快速幂 中有详细介绍快速幂 点击链接即可传送 求解 https blog csdn net weixin 43844521 article details 127
  • 剑指 Offer 18. 删除链表的节点 -- 双指针

    0 题目描述 leetcode原题链接 剑指 Offer 18 删除链表的节点 1 双指针解法 删除值为 val 的节点分需为两步 定位节点 修改引用 定位节点 遍历链表 直到 head val val 时跳出 即可定位目标节点 修改引用
  • 剑指 Offer(第2版)面试题 35:复杂链表的复制

    剑指 Offer 第2版 面试题 35 复杂链表的复制 剑指 Offer 第2版 面试题 35 复杂链表的复制 解法1 模拟 剑指 Offer 第2版 面试题 35 复杂链表的复制 题目来源 48 复杂链表的复刻 解法1 模拟 算法 复制原

随机推荐

  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • 全国各省市座机电话区号整理

    excel数据整理下载地址 https download csdn net download MtiredM 87620876 json格式数据整理 const areaCodes 热门城市 010 北京市 024 沈阳市 0371 郑州市
  • Qt对话框

    Qt的对话框分为两种 模态对话框和非模态对话框 模态对话框 模态对话框 不可以对其其他窗口进行操作 比如像下面这种 出现后无法再操作其他窗口 比如像下面这种 创建后就无法在操作写代码的窗口 创建对话框要将 include
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • C语言经典100例题(18)--题目:求s=a+aa+aaa+aaaa+aa...a的值

    目录 题目 问题分析 代码 测试结果 题目 求s a aa aaa aaaa aa a的值 其中a是一个数字 例如2 22 222 2222 22222 此时共有5个数相加 几个数相加有键盘控制 问题分析 加数之间的规律 a a 0 10
  • Python实现归并排序

    Python实现归并排序 一 归并排序简介 归并排序 Merge Sort 是建立在归并操作上的一种效率很高的排序算法 比较占用内存 该算法是分治法 Divide and Conquer 的一个典型应用 归并排序将两个或两个以上 一般是两个
  • 华为OD机试 Python 【响应报文时间】

    题目 假设你正在接收网络报文 并且需要在一定时间内对它们作出响应 每次当你收到一个报文时 它会有一个 最大响应时间 来告诉你最晚需要在什么时候回应 但是 如果在等待回应期间又收到了新的报文 你可能需要更新你的响应时间 最大响应时间 是这样计
  • 关于uthash 的初步源码阅读

    背景 在偶然的mqtt mosquitto 中的源码中查看的关于topic的处理 知道了哈希表这种的数据结构 最近花了一点时间将这个部分的源码看了一部分 不知道后面还有没有时间继续查看所以就写一篇文档作为笔记吧 uthash 使用 utha
  • 数据ETL面临的问题----数据缺失

    数据缺失的类型有 完全随机缺失 Missing Completely at Random MCAR 数据的缺失与不完全变量以及完全变量都是无关的 随机缺失 Missing at Random MAR 数据的缺失不是完全随机的 数据的缺失只依
  • C++【认知系列】实时获取鼠标坐标

    实时获取鼠标的坐标值 include
  • 配置描述文件mobileconfig的生成及注意事项

    1 mobileconfig描述配置文件的下载 我们要控制ios上的移动设备 那么我们就需要下载mobileconfig描述配置文件 一般我们可以一个设备对应一个设备ID 即我们后面会看到的请求参数 deviceId 例如 PUT Path
  • DHorse v1.3.2 发布,基于 k8s 的发布平台

    版本说明 新增特性 构建版本 部署应用时的线程池可配置化 优化特性 构建版本跳过单元测试 解决问题 解决Vue应用详情页面报错的问题 解决Linux环境下脚本运行失败的问题 解决下载Maven安装文件失败的问题 升级说明 下载v1 3 2安
  • WSL无法访问网络的解决办法

    今天在用WSL的时候突然网络抽风 域名解析出了问题 apt update都用不了 网上查了很多方法 什么vEthernet的IP啊 ifconfigip啊 ip route add default啥的 都不管用 最后还是看了一下 etc r
  • 论文总结——因果发现与推断

    文章目录 背景 非时序因果模型 因果充分性假设 两个变量之间的因果关系 基于约束的方法 结构方程模型 Structural Equation Model SEM 时序因果模型 待解决的问题 参考 背景 很多科学都需要通过观测一组变量或者对其
  • Idea部署OpenCV3.4.14开发环境

    Idea配置OpenCV开发环境 一 开发环境 idea 2018 3 3 opencv 3 4 14 jdk 1 8 0 191 二 下载OpenCV3 4 14 下载地址 https opencv org releases 三 把下载的
  • 解决Keil调试模式下无法设置断点的问题

    问题描述 使用Keil打开工程文件 进入调试模式后 只有main c文件里面可以设置断点 其余文件都不可以设置断点 可能的原因及解决方案 原因1 工程路径包含中文 解决方案1 更换为全英文路径 原因2 工程没有全部Rebuild 解决方案2
  • 单目摄像头光学图像测距_单目测距算法

    单目测距算法 相似三角形 用相似三角形计算物体或者目标到相机的距离 将使用相似三角形来计算相机到一个已知的物体或者目标的距离 假设有一个宽度为 W 的目标或者物体 然后将这个目标放在距离的相机为 D 的位置 用相机对物体进行拍照并且测量物体
  • 报错:No Session found for current thread

    No Session found for current thread 没有找到当前线程的会话 这个问题我是在整合Spring时出现的 问题很好解决 在Hibernate的配置文件hibernate cfg xml中加入这 样一条配置就好
  • “反AI斗士”马斯克宣布成立xAI :目标是了解宇宙真实本质

    北京时间7月13日凌晨 马斯克在Twitter上宣布 xAI正式成立 去了解现实 马斯克表示 推出xAI的原因是想要 了解宇宙的真实本质 Ghat GPT横空出世已有半年 国内外 百模大战 愈演愈烈 AI大模型的现状与发展 你怎么看 方向一
  • 剑指Offer(牛客网)-数据流中的中位数

    题目来源 https www nowcoder com practice 9be0172896bd43948f8a32fb954e1be1 tpId 13 tqId 11216 tPage 4 rp 4 ru ta coding inter