Leetcode 优先队列详解
优先队列
优先队列(Priority Queue):一种特殊的队列。在优先队列中,元素被赋予优先级,当访问队列元素时,具有最高优先级的元素最先删除
普通队列详解Leetcode 队列详解
优先队列与普通队列最大的不同点在于出队顺序
- 普通队列的出队顺序跟入队顺序相关,符合「先进先出(First in, First out)」的规则。
- 优先队列的出队顺序跟入队顺序无关,优先队列是按照元素的优先级来决定出队顺序的。优先级高的元素优先出队,优先级低的元素后出队。优先队列符合 「最高级先出(First in, Largest out)」 的规则

适用场景
优先队列的应用场景非常多,比如:
- 数据压缩:赫夫曼编码算法
- 最短路径算法:Dijkstra 算法
- 最小生成树算法:Prim 算法
- 任务调度器:根据优先级执行系统任务
- 事件驱动仿真:顾客排队算法
- 排序问题:查找第 k 个最小元素
很多语言都提供了优先级队列的实现。比如,Java 的
PriorityQueue,C++ 的priority_queue
Leetcode 真题
数组中的第K个最大元素
解题思路: 典型的优先队列/最大堆,依次入队排序后取队头的第K大的元素
public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}});for (int num : nums) {if (queue.size() == k) {if (queue.peek() < num) {queue.poll();queue.offer(num);}} else {queue.offer(num);}}return queue.poll();
}
前 K 个高频元素
解题思路:使用优先队列记录出现次数topK
int[] 的第一个元素代表数组的值,第二个元素代表了该值出现的次数
public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> occurrences = new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault(num, 0) + 1);}// int[] 的第一个元素代表数组的值,第二个元素代表了该值出现的次数PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() {public int compare(int[] m, int[] n) {return m[1] < n[1] ? -1 : 1;}});for (Map.Entry<Integer, Integer> entry : occurrences.entrySet()) {int num = entry.getKey(), count = entry.getValue();if (queue.size() == k) {if (queue.peek()[1] < count) {queue.poll();queue.offer(new int[]{num, count});}} else {queue.offer(new int[]{num, count});}}int[] ret = new int[k];for (int i = 0; i < k; ++i) {ret[k - i - 1] = queue.poll()[0];}return ret;
}
滑动窗口最大值
解题思路:使用优先队列记录窗口范围内的topK大数
int[] 的第一个元素代表数组的值,第二个元素代表了该值的下标
根据数组元素从大到小进行排序,若是元素相同的话,则根据下标进行从大到小进行排序
public int[] maxSlidingWindow(int[] nums, int k) {int[] result = new int[nums.length - k + 1];PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] == o2[0] ? o2[1] - o1[1] : o2[0] - o1[0];}});for (int i = 0; i < k - 1; i++) {queue.offer(new int[]{nums[i], i});}for (int i = k - 1; i < nums.length; i++) {queue.offer(new int[]{nums[i], i});// 若是优先队列/最大堆的堆顶元素 不在滑动窗口范围内,则直接从优先队列中进行删除while(queue.peek()[1] <= i - k){queue.poll();}result[i - k + 1] = queue.peek()[0];}return result;
}
参考资料:
- 优先队列知识
- Leetcode 队列详解
相关文章:
Leetcode 优先队列详解
优先队列 优先队列(Priority Queue):一种特殊的队列。在优先队列中,元素被赋予优先级,当访问队列元素时,具有最高优先级的元素最先删除 普通队列详解Leetcode 队列详解 优先队列与普通队列最大的不同点在于…...
通过两道一年级数学题反思自己
背景 做完这两道题我开始反思自己,到底是什么限制了我?是我自己?是曾经教导我的老师?还是我的父母? 是考试吗?还是什么? 提目 1、正方体个数问题 2、相碰可能性 过程 静态思维: …...
Pytorch :从零搭建一个神经网络
文章目录安装依赖从源码编译pytorchCXX_ABI问题数据集归一化Transforms搭建神经网络Components of a neural networknn.Flattennn.Linearnn.Sequentialnn.SoftmaxModel Parameters优化模型参数设置超参数添加优化循环添加 loss function优化过程完整实现模型的保存和加载安装 …...
【华为OD机试 2023最新 】 区块链文件转储系统(C++ 100%)
题目描述 区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2,…,Fn。随着时间的推移,所占存储会越来越大。 云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘…...
基于springcloud实现分布式架构网上商城演示【项目源码】分享
基于springcloud实现分布式架构网上商城演示摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包…...
【Qt】(自制类)适用于QTextCharFormat的字体选择对话框
先附上github链接:https://github.com/Ls-Jan/Qt_CharFormatDialog 主要是作为QFontDialog的平替/增强,毕竟Qt自带的字体选择器一言难尽(用过的都叹气)。 【运行界面】 【功能】 一目了然,可以选择字体,设置字号,设置…...
Unity即时战略/塔防项目实战(一)——构造网格建造系统
Unity即时战略/塔防项目实战(一)—— 构造网格建造系统 效果展示 Unity RTS游戏网格建造系统实现原理 地形和格子划分,建造系统BuildManager构建 地形最终需要划分成一个一个的小方格,首先定义一下小方格: private…...
【ZOJ 1095】Humble Numbers 题解(动态规划)
一个素数只有2,3,5或7的数被称为谦逊数。序列1、2、3、4、5、6、7、8、9、10、12、14、15、16、18、20、21、24、25、27。。。显示了前20个不起眼的数字。 编写一个程序来查找并打印此序列中的第n个元素。 输入规范 输入由一个或多个测试用例组成。每个…...
百科媒体背书,什么媒体的收录可以修改百科?
传媒如春雨,润物细无声,大家好 大家都知道百科在百度搜索引擎中有很高的权重,排名非常靠前,任何机构,个人,或者企业做网络宣传百科是必不可少的,虽然任何人都可以注册并编辑其内容。但是&#x…...
USB鼠标实现——HID 报告的返回(八)
文章目录HID 报告的返回仓库地址USB 鼠标阅读顺序报告返回HID 报告的返回 仓库地址 仓库地址 USB 鼠标阅读顺序 枚举过程USB鼠标实现——设备描述符(一)USB鼠标实现——设置地址(二)USB鼠标实现——配置描述符集合(…...
DOPE PEG Maleimide,DOPE-PEG-Mal,二油酰磷脂酰乙醇胺PEG马来酰亚胺
文章关键词:高分子PEG,DOPE,聚乙二醇化修饰试剂基团反应特点: DOPE PEG Maleimide是一种由 DOPE 和马来酰亚胺基团组成的 PEG 化合物。基础产品数据: CAS号:N/A 中文名:1,2-二油酰-SN-甘油-3-磷…...
python-课后作业-2
1.Python 3.x的range()函数返回一个:可迭代的序列对象 注意: Python 3.x的range()函数返回一个可迭代的序列对象,其中包含指定范围内的整数。range()函数的语法如下: range([start], stop[, step]) 其中,start表示序…...
redis 六. list应用场景及底层分析
List 类型一. 简单命令示例二. java 操作示例三. 使用场景四. 底层分析一. 简单命令示例 1.首先简单说明: List是一个双端链表的结构,内容是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈,队列,消息队列等场景 2.简单命令 //1.向列表左边添加元素 LPUSH ke…...
成语填字接龙隐私政策
1. 适用范围 (a) 在您注册本应用帐号时,您根据本应用要求提供的个人注册信息; (b) 在您使用本应用网络服务,或访问本应用平台网页时,本应用自动接收并记录的您的浏览器和计算机上的信息,包括但不限于您的IP地址、浏览…...
导出LKD3588开发板的根文件系统
序:将RK3588上的整个根文件系统的文件通过ssh拷贝到PC系统(虚拟机) 工具:RK3588上的ubuntu系统需要安装:ssh, rsync。 PC电脑(虚拟机)上安装:ssh, rsync。 安装ssh 和rsync不做介绍,百度里面全是,也很简单需要设置开发板root权限的密码,因为后面同步文件的时候会用到…...
【统计模型】某地区土壤所含可给态磷回归分析
目录 某地区土壤所含可给态磷回归分析 一、研究目的 二、数据来源和相关说明 三、描述性分析 3.1 样本描述 3.2 数据可视化 四、数据建模 4.1 回归模型A 4.2 回归模型B 4.3 回归模型B模型诊断 4.4 回归模型C 五、结论及建议 5.1 结论 5.2 建议 六、代码 某地区土…...
redis 十. 线程基础
目录一. redis 基础复习与了解redis6二. redis 线程问题总结一. redis 基础复习与了解redis6 redis官网, redis中文网站, redis命令参考网站此处以redis6.0.8或以上版本为例(查看自己redis版本命令"redis- server -v")按照redis6以上版本测试使用时,redis.conf下需要…...
NQA简介
NQA简介定义目的NQA原理描述使用DHCP进行测试DNS测试NQA的联动机制NQA的应用场景定义 网络质量分析NQA(Network Quality Analysis)是一种实时的网络性能侦探和统计技术,可以对响应时间、网络抖动、丢包率等网络信息进行统计。NQA能够实时监视…...
[python]上下文管理contextlib模块与with语句
文章目录with语句自定义对象支持withcontextlib模块closing自动关闭suppress回避错误ExitStack清理Python 中的 with 语句用于清理工作,封装了 try…except…finally编码范式,提高了易用性。with语句 with语句有助于简化资源管理: # 离开作…...
STM32之TIM编码器接口
编码器简介: 例子讲解:正交编码器有两个输出,一个A相,一个B相,AB接口输出正交信号。然后接入STM32的定时器的编码器接口,编码器接口自动控制定时器时基单元中的CNT计数器进行自增或自减,比如初始…...
Transformer解码器实战:用PyTorch手写Masked Self-Attention(附避坑指南)
Transformer解码器实战:用PyTorch手写Masked Self-Attention(附避坑指南) 1. 为什么需要Masked Self-Attention 在文本生成任务中,模型需要遵循自回归特性——即生成当前词时只能依赖已生成的词。想象你正在玩文字接龙游戏&#x…...
Windows下用MSYS2编译axel多线程下载工具的保姆级教程(附常见错误解决方案)
Windows下MSYS2编译axel多线程下载工具全指南 如果你厌倦了商业下载工具的臃肿和限制,又对Python多线程下载的稳定性不满,那么编译一个原生的axel多线程下载工具可能是最佳选择。本文将带你从零开始在Windows环境下,通过MSYS2完整编译axel&a…...
若依框架多数据源实战:如何用@DataSource注解轻松切换MySQL主从库
若依框架多数据源实战:用DataSource注解实现MySQL主从库智能切换 当系统流量逐渐攀升,数据库的读写压力开始显现时,很多开发者都会面临一个关键决策:如何在保证数据一致性的前提下,有效分散数据库负载?若依…...
Mamba模型实战:如何用Python快速搭建一个长序列处理Demo(附代码)
Mamba模型实战:如何用Python快速搭建一个长序列处理Demo(附代码) 在自然语言处理和时间序列分析领域,处理长序列数据一直是个棘手的问题。传统Transformer架构虽然表现出色,但随着序列长度增加,其计算复杂度…...
从零到部署:手把手教你用Django+OpenCV搭建一个能识别交通标志的“智能眼”(附完整源码)
实战指南:用DjangoOpenCV构建高精度交通标志识别系统 1. 环境配置与项目初始化 在开始构建交通标志识别系统前,需要准备完善的开发环境。以下是经过验证的配置方案: 核心工具栈选择: Python 3.9(推荐3.10.6版本&#x…...
手把手教你用ChatGPT-Next-Web(NextChat)免费搭建个人AI助手网站(附Docker部署)
零代码实战:用ChatGPT-Next-Web快速搭建专属AI对话平台 在AI技术平民化的浪潮中,拥有一个私人定制的智能对话平台不再是大公司的专利。ChatGPT-Next-Web(原名NextChat)作为GitHub上最受欢迎的AI界面开源项目之一,让普…...
ESP8266高速移位寄存器驱动库:3.8μs级GPIO直控
1. FastEsp8266ShiftRegister 库概述FastEsp8266ShiftRegister 是一款专为 ESP8266 微控制器深度优化的高速移位寄存器驱动库。其核心设计目标是突破传统软件模拟 SPI 或标准 GPIO 操作在 ESP8266 上的性能瓶颈,实现接近硬件 SPI 时序精度、但具备更高灵活性的并行/…...
三极管倍频 vs 锁相环倍频:短波通信场景下的5个关键性能对比实验
三极管倍频与锁相环倍频在短波通信中的5组实测性能对决 短波通信系统的核心挑战之一在于如何生成高稳定度的射频信号。当工程师需要在有限频谱资源中实现高效传输时,频率合成技术的选择往往决定了系统整体性能。本文将基于实际测试平台,对比分析三极管倍…...
别再手动比对了!用Python+PyTorch搭建你的第一个遥感变化检测模型(附实战代码)
用PythonPyTorch实现遥感变化检测:从数据预处理到模型部署全流程指南 遥感影像的变化检测技术正在城市规划、环境监测、灾害评估等领域发挥越来越重要的作用。传统人工比对方法效率低下,而基于深度学习的自动化解决方案正在重塑这个领域的技术格局。本文…...
从图片预览需求看H5监听浏览器返回事件的3种实现方案(含history API避坑指南)
从图片预览需求看H5监听浏览器返回事件的3种实现方案(含history API避坑指南) 在移动端H5开发中,图片预览功能几乎是标配需求。随着全面屏手势操作的普及,用户越来越习惯通过滑动返回退出预览,而非点击关闭按钮。这种交…...
