算法通关村第十四关—数据流的中位数(黄金)

数据流中中位数的问题

 LeetCode295,中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如:[2,3,4]的中位数是3
[2,3]的中位数是(2+3)/2=2.5
实现 MedianFinder 类:

  • MedianFinder() 初始化 MedianFinder 对象。
  • void addNum(int num) 将数据流中的整数 num 添加到数据结构中。
  • double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

image.png
 分析这是一道比较难的题目了,如果没专门学过,很难在面试时想到。
 中位数的题,我们一般都可以用大顶堆+小顶堆来求解,下面我们通过直观的例子解释一下怎么做。
小顶堆(minHeap):存储所有元素中较大的一半,堆顶存储的是其中最小的数。
大顶堆(maxHeap):存储所有元素中较小的一半,堆顶存储的是其中最大的数。
 相当于,把所有元素分成了大和小两半,而我们计算中位数,只需要大的那半的最小值和小的那半的最大值即可。比如,我们依次添加[1,2,3,4,5],砍成两半之后为[1,2]和[3,4,5],我们只要能快速的找到2和3即可。
 下面看看使用两个堆它们是怎么变化的:
1.添加1,进入到minHeap中,中位数为1:截屏2024-01-15 07.27.57.png
2.添加2,它比minHeap堆顶元素1大,进入minHeap,同时,minHeap中元素超过了所有元素总和的一半,所以,要平衡一下,分一个给maxHeap,中位数为(1+2)/2.0=1.5:截屏2024-01-15 07.28.05.png
添加3,它比minHeap堆顶元素2大,进入minHeap,中位数为2:截屏2024-01-15 07.28.13.png
添加4,它比minHeap堆顶元素2大,进入minHeap,同时,minHeap中元素超过了所有元素总和的一半,所以,要平衡一下,分一个给maxHeap,中位数为(2+3)/2.0=2.5:截屏2024-01-15 07.28.33.png
5.添加5,它比minHeap堆J顶元素3大,进入minHeap,中位数为3:截屏2024-01-15 07.28.40.png

 Java中的堆(即优先级队列)是使用完全二叉树实现的,我们这里的图也是以完全二叉树为例。理解了上述的过程,看代码就比较简单了
 代码如下

class MedianFinder {
    PriorityQueue<Integer> queleft;
    PriorityQueue<Integer> queright;

    public MedianFinder() {
        queleft = new PriorityQueue<Integer>((a, b) -> (b - a));//中位数左边是大顶堆
        queright = new PriorityQueue();//中位数右边是小顶堆
    }
    
    public void addNum(int num) { //添加元素
        if(queleft.isEmpty() || num <= queleft.peek()){
            queleft.offer(num);
            if(queleft.size() > queright.size() + 1){ //queleft最多比queright多一个元素
                queright.offer(queleft.poll());
            }
        }
        else{
            queright.offer(num);
            if(queright.size() > queleft.size()){
                queleft.offer(queright.poll());
            }
        }
    }
    
    public double findMedian() { 
        if(queleft.size() > queright.size()){//奇数情况
            return 1.0 * queleft.peek();
        }
        else return (queleft.peek() + queright.peek()) / 2.0;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/323319.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漏洞修复整理

一、Geoserver Apache HTTP/2拒绝服务漏洞&#xff08;CVE-2023-44487&#xff09;、Eclipse Jetty 资源管理错误漏洞(CVE-2023-26048)、Eclipse Jetty 信息泄露漏洞(CVE-2023-26049) 受影响版本&#xff1a;9.4.53以下版本 处理方式&#xff1a;原地升级 &#xff08; jdk版本…

开源ERP系统Odoo安装部署并结合内网穿透实现公网访问本地系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

ESP系列入门教程(二)——之简单驱动温湿度传感器DHT11【附 ESP32 / ESP8266 通用代码】

ESP系列入门教程<二> 概要技术名词简介● ESP系列简介 硬件连接实现代码实现●Demo&#xff1a;驱动DHT11温湿度传感器●编译注意事项&#xff1a;添加DHT库 概要 最近在跟着几个大佬的教学视频做项目。陆续会更新记录一些要点&#xff0c;便于后期总结笔记的时候进行引…

鸿蒙开发OpenHarmony组件复用案例

概述 在开发应用时&#xff0c;有些场景下的自定义组件具有相同的组件布局结构&#xff0c;仅有状态变量等承载数据的差异。这样的组件缓存起来&#xff0c;需要使用到该组件时直接复用&#xff0c; 减少重复创建和渲染的时间&#xff0c;从而提高应用页面的加载速度和响应速度…

windows平台高dpi介绍

flutter在windows平台如何自定义dpi设置 系统层级的支持(windows平台对高dpi的支持) 主要有两点&#xff1a; 设置系统的缩放比例 (系统及系统自带的app会根据这个设置来进行缩放&#xff1b;自己的app需要结合自己设置的dpi awareness来实现对应的dpi支持)设置进程的dpi aw…

工作为了什么,因为人间值得

人生&#xff0c;只要照亮某个角落就够了。《人间值得》这本书的名字我没有考证&#xff0c;但是读书的内容可以推断&#xff0c;作者应该不是用本书来表达《人间值得》的内涵。通篇略读&#xff0c;并没有写人间哪儿值得&#xff0c;没有写人间的真善美、甚至爱&#xff0c;而…

simulink之Data Type Conversion

Data Type Conversion 将输入信号转换为指定的数据类型。 数据类型转换块将任何Simulink数据类型的输入信号转换为您为输出数据类型参数指定的数据类型。输入可以是任何实值或复值信号。如果输入是真实的&#xff0c;那么输出就是真实的。如果输入是复杂的&#xff0c;那么输出…

Altium Designer简介以及下载安装

阅读引言&#xff1a; Altium Designer的离线安装包在文章最后&#xff0c; 注意该软件只能用于个人的学习使用&#xff0c; 不能用于商业用途&#xff0c; 文章主题图片来自网络。 一、Altium Designer简介 Altium Designer是一款功能强大的电子设计自动化&#xff08;EDA&…

ant design vue Tree组件叶子节点横向排列

antdesignvue的树形组件要实现组件叶子节点横向排列有点坑&#xff0c;没有 配置属性&#xff0c;需要自己想办法。 要实现的效果 看tree组件的dom结构&#xff0c;父元素flex竖向布局&#xff0c;子项不论节点层级都在同一层&#xff01;&#xff01;&#xff01; 难点在于想…

vue使用i18n实现国际化

安装 npm install vue-i18nnext在src下创建一个名为i18n的文件夹,并按照下图创建需要的文件 i18n/locales/en.json {"common": {"BUTTON_OK": "OK","BUTTON_CANCEL": "Cancel","BUTTON_SUBMIT": "Submit…

FTP和本地yum搭建

一、文件共享服务 1.存储类型 二、FTP文件传输协议 1.工作原理 2.登录 三、vsftpd服务修改默认命令端口 四、内网搭建yum仓库 方法一&#xff1a;通过ftp服务搭建内网yum仓库服务器 补充 方法二&#xff1a;通过httpd协议搭建内网yum仓库服务器

Windows系统搭建WebDAV服务并结合内网穿透实现公网访问本地文件

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

配置华为设备NQA UDP Jitter检测VoIP业务抖动

组网需求 如图1所示&#xff0c;总部和子公司之间需要跨越外部网络进行通信&#xff0c;DeviceA和DeviceD为总部和子公司的网络出口设备&#xff0c;DeviceB和DeviceC为外部网络提供商的边缘设备。 总部和子公司之间经常要通过VoIP进行电话会议&#xff0c;要求双向时延小于2…

【架构】docker实现主从容错切换迁移【案例2/4】

实现主从容错切换迁移 在3主3从【案例1/4】的基础上&#xff0c;实现主从容错切换迁移&#xff0c;示意图如下&#xff1a; 一、数据读写存储 1、启动6机构成的集群并通过exec进入&#xff08;任意一台都行&#xff09;&#xff1a; docker exec -it redis-node-1 /bin/bas…

封装日期时间组件

概述 该组件包含日期选择&#xff0c;任意时间选择、固定时间点选择。 子组件代码(date-picker.vue) <template><div id"date_picker"><el-popover placement"top" width"322" trigger"click" ref"popover&quo…

OpenCV-Python(35):BRIEF算法

算法介绍 BRIEF&#xff08;Binary Robust Independent Elementary Features&#xff09;是一种用于计算机视觉中特征点描述子的算法。它是一种二进制描述子&#xff0c;通过比较图像上不同位置的像素值来生成特征点的描述子。 BRIEF算法的基本思想是选取一组固定的像素对&…

[VGG团队论文阅读]Free3D: Consistent Novel View Synthesis without 3D Representation

Vedaldi, C. Z. A. (n.d.). Free3D: Consistent Novel View Synthesis without 3D Representation. Chuanxiaz.com. https://chuanxiaz.com/free3d/static/videos/Free3D.pdf Free3D: 无需3D表示的一致新视角合成 Visual Geometry Group, University of Oxford 摘要 我们介绍…

Radzen Blazor Studio 脚手架框架解读

背景 组织管理管理准备使用Blazor这个工具实现&#xff0c;因为其有对应的 scaffold 脚手架&#xff0c;先构建数据库&#xff0c;然后通过向导&#xff0c;生成CRUD以及对应的接口&#xff0c;那么有必要看一下&#xff0c;其内部的代码结构是什么样的。 结构 接口层 有两类…

MIT 6s081 blog1.xv6内存管理

xv6内存管理部分 xv6内存布局 内核地址空间 如xv6指导书中图3.3&#xff1a;从0x80000000开始的地址为内核地址空间&#xff0c;CLINT、PLIC、uart0、virtio disk等为I/O设备&#xff08;内存映射I/O&#xff09;&#xff0c;可以看到xv6虚拟地址到物理地址的映射&#xff0…

YOLOv8目标检测中数据集各部分的作用

自学答疑使用&#xff0c;持续更新… 在目标检测任务中&#xff0c;通常将整个数据集划分为训练集&#xff08;training set&#xff09;、验证集&#xff08;validation set&#xff09;和测试集&#xff08;test set&#xff09;。这三个数据集在训练和评估过程中具有不同的…