LeetCode 热题 100 | 堆(三)

目录

1  队列 - v2.0

2  295. 数据流的中位数

2.1  解题思路

2.2  举例说明

2.3  维持队列

2.4  求中位数

2.5  完整代码


菜鸟做题,语言是 C++

1  队列 - v2.0

排序规则果然和名字是反过来的:

// 大根堆
priority_queue<int, vector<int>, less<int>> queMin;
// 小根堆
priority_queue<int, vector<int>, greater<int>> queMax;

2  295. 数据流的中位数

2.1  解题思路

解题思路:

  • 维护两个优先队列 queMin 和 queMax
  • 前者(是大根堆)存放比中位数 midNum 小的数
  • 后者(是小根堆)存放比中位数 midNum 大的数

解题要点:

  • 维护 midNum 以进行比较
  • 保持 queMin 和 queMax 的大小基本一致

本质上就是将 nums 数组砍半,并且是按从小到大的顺序分别存储在 queMin 和 queMax 中的。到时候,中位数必定出自 queMin 或 queMax 的根元素。

2.2  举例说明

假设 nums 是 [4,5,2,1,3] 。

对于第一个数字 4,我们可以不分青红皂白地把它插入到 queMin 中,同时更新中位数为 4;对于第二个数字 5,由于 5 大于中位数,因此插入 queMax 中,同时更新中位数为 4.5;对于第三个数字 2,由于 2 小于中位数,因此插入 queMin 中。

对于第四个数字 1,由于 1 小于中位数,因此插入 queMin 中。注意:这个时候 queMin 比 queMax 多两个元素了,不满足 “砍半” 要求!因此我们需要将 4 转移到 queMax 中,同时更新中位数为 3。对于第五个数字 3,由于 3 等于中位数,因此随机插入 queMin 中。

2.3  维持队列

对 2.2 节思路的实现

void addNum(int num) {
    if (!queMin.size()) {
        queMin.push(num);
        return;
    }

    midNum = findMedian();
    if (num < midNum) {
        if (queMin.size() > queMax.size()) {
            queMax.push(queMin.top());
            queMin.pop();
        }
        queMin.push(num);
    } else {
        if (queMin.size() < queMax.size()) {
            queMin.push(queMax.top());
            queMax.pop();
        }
        queMax.push(num);
    }
}

2.4  求中位数

代码逻辑:

  • 若 queMin 和 queMax 不一样长,则中位数是较长一方的根元素
  • 若 queMin 和 queMax 一样长,则中位数等于二者根元素之和 / 2
double findMedian() {
    double ans;
    if (queMin.size() < queMax.size()) {
        ans = queMax.top();
    } else if (queMin.size() > queMax.size()) {
        ans = queMin.top();
    } else {
        ans = (queMin.top() + queMax.top()) / 2.0;
    }
    return ans;
}

2.5  完整代码
class MedianFinder {
private:
    priority_queue<int, vector<int>, less<int>> queMin;
    priority_queue<int, vector<int>, greater<int>> queMax;
    int midNum;

public:
    MedianFinder() { }
    
    void addNum(int num) {
        if (!queMin.size()) {
            queMin.push(num);
            return;
        }

        midNum = findMedian();
        if (num < midNum) {
            if (queMin.size() > queMax.size()) {
                queMax.push(queMin.top());
                queMin.pop();
            }
            queMin.push(num);
        } else {
            if (queMin.size() < queMax.size()) {
                queMin.push(queMax.top());
                queMax.pop();
            }
            queMax.push(num);
        }
    }
    
    double findMedian() {
        double ans;
        if (queMin.size() < queMax.size()) {
            ans = queMax.top();
        } else if (queMin.size() > queMax.size()) {
            ans = queMin.top();
        } else {
            ans = (queMin.top() + queMax.top()) / 2.0;
        }
        return ans;
    }
};

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

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

相关文章

干货 | 2024 年 Elasticsearch 常见面试题集锦

当涉及到 Elasticsearch 开发者的面试时&#xff0c;问题通常会更专注于软件开发生命周期内与 Elasticsearch 集成的具体技术细节和实际应用场景。 以下是一些Elasticsearch开发相关的面试题目&#xff0c;题目来自死磕 Elasticsearch 知识星球。 1、Elasticsearch数据建模相关…

【MySQL系列】Public Key Retrieval is not allowed

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

人事管理系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW调试部署环境&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java…

【科学计算与数学建模】logistic回归预测二分类

任务描述相关知识 数据集以及任务介绍 任务数据集数据属性信息提供的特征属性格式提交的数据格式实现方法—Logistic Regression 加载数据数据标准化逻辑回归模型验证集的使用&#xff08;Validation set&#xff09;训练过程画图函数测试数据的使用预测二分类编程要求测试说明…

ConcurrentHashMap源码分析

文章目录 ConcurrentHashMap源码分析jdk1.7版本重要成员变量put方法源码分析 jdk1.8版本重要成员变量put方法源码分析 ConcurrentHashMap源码分析 在集合类中HashMap是比较常用的集合对象&#xff0c;但是HashMap是线程不安全的。为了保证数据的安全性我们可以使用Hashtable&a…

【LLM】LongRoPE:LLM上下文窗口扩展方法及非官方实现

前言 目前&#xff0c;大多数LLMs的上下文窗口限制在4k个标记左右&#xff0c;这意味着模型在处理超过这个长度的文本时性能会下降。这种限制对于需要大量上下文信息的场景&#xff0c;虽然可以通过在更长的文本上进行微调来将预训练LLM的上下文窗口扩展上下文窗口&#xff0c…

【鸿蒙系统】 ---OpenHarmony加快本地编译(二)

&#x1f48c; 所属专栏&#xff1a;【鸿蒙系统】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢…

SpringBoot3集成PostgreSQL

标签&#xff1a;PostgreSQL.Druid.Mybatis.Plus&#xff1b; 一、简介 PostgreSQL是一个功能强大的开源数据库系统&#xff0c;具有可靠性、稳定性、数据一致性等特点&#xff0c;且可以运行在所有主流操作系统上&#xff0c;包括Linux、Unix、Windows等。 通过官方文档可以…

MySQL:表的操作

文章目录 创建表查看表结构修改表删除表 前面对于库的操作有了认识后&#xff0c;下面进行表的操作 创建表 以下图为例 创建表其实和定义结构体有点类似&#xff0c;总的来说就是先定义列名&#xff0c;然后后面跟着是列的数据类型&#xff0c;之后在定义结束后可以带上对应的…

校园圈子系统--自带校园跑腿功能,校园交友,校园陪玩,校园交友墙,地图找伴,二手市场等功能。源码交付,支持二开!APP小程序H5等移动端都有。

一、需求分析 在搭建校园论坛平台之前&#xff0c;我们需要进行详细的需求分析。这包括以下几个方面&#xff1a; 1.用户需求 我们需要了解目标用户群体的需求和喜好&#xff0c;包括学生的年龄层次、兴趣爱好、关注话题等。通过调查问卷、访谈等方式收集用户需求&#xff0c;为…

数学算法(算法竞赛、蓝桥杯)--最大公约数,欧几里得算法

1、B站视频链接&#xff1a;G05 最大公约数 欧几里得算法_哔哩哔哩_bilibili 题目链接&#xff1a;[NOIP2001 普及组] 最大公约数和最小公倍数问题 - 洛谷 #include <bits/stdc.h> using namespace std; typedef long long LL; LL x,y,ans;LL gcd(LL a,LL b){return b0?…

包叔推荐12代i3-独显组装电脑主机配置清单

去年Intel第十代i5-依然是主流热选机型。 今年&#xff0c;随着i3-的价格优势越来越大&#xff0c;已经成功取代了i5-。 今天包叔推荐几套12代i3-独立显卡组装电脑主机配置。 列表&#xff1a;一组核心显示配置&#xff0c;其余三组均为独立显示配置。 适合主机预算在2000元至3…

JDK下载配置

一、JDK的作用 Java开发环境&#xff1a;JDK提供了完整的Java开发环境&#xff0c;包含编译器&#xff08;javac&#xff09;、解释器&#xff08;java&#xff09;、打包工具&#xff08;jar&#xff09;、文档生成工具&#xff08;javadoc&#xff09;等一系列工具&#xff0…

【高并发服务器 01】—— 基础知识回顾

接下来四周时间&#xff0c;我将会做一个高并发服务器相关的项目。 前置知识&#xff1a;操作系统系统编程、网络编程、基础的数据结构、C语言。 开发环境&#xff1a;VMware虚拟机&#xff1a;Ubuntu 20.04.6 LTS、vscode 今天先回顾一些基础知识。 1.文件与IO 标准IO&#…

软件测试教程 性能测试概论

文章目录 1. 性能测试实施的流程1.1 常见的性能问题1.2 性能测试是什么&#xff1f;1.3 性能测试和功能测试之间的区别1.4 什么样的系统/软件表现属于性能好&#xff0c;什么样的软件性能表现属于性能不好1.5 为什么要进行性能测试1.6 性能测试实施的流程1.7 常见的性能指标以及…

Python虚拟环境conda的安装使用

文章目录 conda虚拟环境的详细步骤和注意事项&#xff1a;**安装Conda****创建Conda虚拟环境****激活Conda虚拟环境****安装Python包****管理Conda环境****其他优势与特性** 相较于venv&#xff0c;使用conda管理虚拟环境有以下优势&#xff1a;**性能****资源占用****其他性能…

【jvm】jinfo使用

jinfo介绍 jinfo 是一个命令行工具&#xff0c;用于查看和修改 Java 虚拟机&#xff08;JVM&#xff09;的配置参数。它通常用于调试和性能调优。 使用 jinfo 命令&#xff0c;你可以查看当前 JVM 的配置参数&#xff0c;包括堆大小、线程数、垃圾回收器类型等。此外&#xf…

立体统计图表绘制方法(分离式环图)

立体统计图表绘制方法&#xff08;分离式环形图&#xff09; 记得我学统计学的时候&#xff0c;那些统计图表大都是平面的框框图&#xff0c;很呆板&#xff0c;就只是表现出统计的意义就好了。在网络科技发展进步的当下&#xff0c;原来一些传统的统计图表都有了进一步的创新。…

unity 多屏幕操作

想了解基础操作请移步&#xff1a;&#xff08;重点是大佬写的好&#xff0c;这里就不再赘述&#xff09; Unity 基础 之 使用 Display 简单的实现 多屏幕显示的效果_unity display-CSDN博客 在panel上也可以通过获取 Canvas&#xff0c;来达到切换多屏幕的操作&#xff0c; …

数据结构基础:一篇文章教你单链表(头插,尾插,查找,头删等的解析和代码)

和我一起学编程呀&#xff0c;大家一起努力&#xff01; 这篇文章耗时比较久&#xff0c;所以大家多多支持啦 链表的结构及结构 概念&#xff1a;链表是⼀种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 理解&a…