算法通过村第十六关-滑动窗口|黄金笔记|结合堆的应用

文章目录

  • 前言
  • 堆与滑动窗口结合的问题
  • 总结


前言


提示:不论记忆多么痛苦,它属于过去,已经逝去了,我们为什么还执着于它并让它代表我们?我们就这样,所以,我们受苦。 --丹津·葩默

这个还是一个比较重要的问题呢,滑动窗口结合堆的特性解决一些问题。

堆与滑动窗口结合的问题

在堆的一章,我们解释了,堆的有限性,但是返回当前位置的最大值或最小值。这除了堆,没有更合适的了。推荐:算法通过村第十四关-堆|白银笔记|经典问题-CSDN博客

然而这结合滑动窗口,可以擦出不一样的火花,非常适合一些特定场景下解决一些题目

239. 滑动窗口最大值 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述

这种方式,我们在基础算法的堆中已经说过这种问题了,对于找最大值、K个最大的这种场景,优先队列(堆)是首选。

大致思路:我们将数组nums的前k个元素放入优先队列中,每当我们向右移动窗口时,我们就可以把一个新的元素放入优先队列中,此时堆顶的元素就是所有元素的最大值,。然而这个最大值可能并不在滑动窗口中,在这种情况下,这个数组的中间的位置出现在滑动窗口左边界的左侧。因此,当我们后序继续移动窗口的时候,这个值就永远不可能出现在滑动窗口中了,我们可以将其永久地从优先队列中移除。

我们不断的移除堆顶的元素,知道其确实出现在滑动窗口中,此时堆顶的元素就是滑动窗口中的最大值,为了方便判断堆顶元素与滑动的窗口的位置关系,我们可以在优先队列总存储二元组(num,index)表示元素num在数组中的下标。

    /*** 滑动窗口最大值* @param nums* @param k* @return*/public static int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;// 二元组处理 提高 (a+c)/2 格PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] != o2[0] ? o2[0] - o1[0] : o2[1] - o1[1];}});// 先进去形成窗口for (int i = 0; i < k; i++) {pq.offer(new int[]{nums[i],i});}// 第一个数已经生成int[] ans = new int[n - k + 1];ans[0] = pq.peek()[0];// 窗口移动for (int i = k; i < n; i++) {pq.offer(new int[]{nums[i],i});// 确保在堆中if (pq.peek()[1] < i - k){pq.poll();}ans[i - k + 1] = pq.peek()[0];}return ans;}

当然了,本地还有其他解法,比如双向队列,单调队了啦。这个后面研究哈,不过都没这个直接,容易提升

二元组处理 提高 (a+c)/2 格。

喜欢拓展的朋友可以看看下一题:如果找中位数怎么处理呢?可以使用两个堆做处理,推荐题目⭐⭐⭐⭐:

400. 第 N 位数字 - 力扣(LeetCode)


总结

提示:滑动窗口;双指针;堆(优先队列);滑动窗口和堆的结合;二元组思想


如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ ("▔□▔)/

如有不理解的地方,欢迎你在评论区给我留言,我都会逐一回复 ~

也欢迎你 关注我 ,喜欢交朋友,喜欢一起探讨问题。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程/线程/PCB

进程&#xff1a;正在运行中的程序&#xff08;进程是驻留在内存中的&#xff09; 是系统执行资源分配和调度的独立单位每一个进程都有属于自己的存储空间和系统资源注意&#xff1a;进程A 和 进程B 的内存独立不共享 使用jdk自带的工具&#xff0c;jconsole查看当前Java进程中…

CentOS 编译安装 nginx

CentOS 编译安装 nginx 修改 yum 源地址为 阿里云 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum makecache升级内核和软件 yum -y update安装常用软件和依赖 yum -y install gcc gcc-c make cmake zlib zlib-devel openss…

IntelliJ IDEA 常用快捷键-个人查阅

Ctrl快捷键 介绍 Ctrl F 在当前文件进行文本查找 &#xff08;必备&#xff09; Ctrl R 在当前文件进行文本替换 &#xff08;必备&#xff09; Ctrl Z 撤销 &#xff08;必备&#xff09; Ctrl Y 删除光标所在行 或 删除选中的行 &#xff08;必备&#x…

electron27+react18集成搭建跨平台应用|electron窗口多开

基于Electron27集成React18创建一个桌面端exe程序。 electron27-vite4-react18基于electron27结合vite4构建工具快速创建react18跨端应用实践。 版本列表 "vite": "^4.4.5" "react": "^18.2.0" "electron": "^27.0.1&…

CloudQuery + StarRocks:打造高效、安全的数据库管控新模式

随着技术的迅速发展&#xff0c;各种多元化的数据库产品应运而生&#xff0c;它们不仅类型众多&#xff0c;而且形式各异&#xff0c;国产化数据库千余套&#xff0c;开源数据库百余套 OceanBase 、PolarDB 、StarRocks…还有一些像 Oracle、MySQL 这些传统数据库。这些数据库产…

读取Excel的工具类——ExcelKit

文章目录 ExcelKit工具类1、准备工作1.1、SheetInfoVo1.2、BizException 2、读取xlsx3、读取xls4、完整的ExcelKit.java源码 ExcelKit工具类 1、准备工作 1.1、SheetInfoVo import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import …

太极v14.0.4 免ROOT用Xposed

一个帮助你免 Root、免解锁免刷机使用 Xposed 模块的 APP 框架。 模块通过它改变系统和应用的行为&#xff0c;既能以传统的 Root/ 刷机方式运作&#xff0c; 也能免 Root/ 免刷机运行&#xff1b;并且它支持 Android 5.0 ~ 11。 简单来说&#xff0c;太极就是个 Xposed 框架…

2024线性代数复习——矩阵代数

相似矩阵&#xff1a;存在可逆矩阵 P P P&#xff0c;使得 P − 1 A P B P^{-1} A PB P−1APB&#xff0c;则称矩阵 A A A&#xff0c; B B B 相似&#xff0c;特征值相等。注意只有相似矩阵 B B B 是对角阵&#xff0c;我们才说它是可以相似对角化的。 A A A 可以相似对角…

vue 复杂的流程图实现--antv/g6

可以先看下对应的文档&#xff1a;G6 Demos - AntV npm install --save antv/g6 实现如图&#xff1a; <template><div class"drawflow"><div id"mountNode"></div></div> </template> <script> import G6 fr…

Qwt QwtPlotMarker标记类详解

1.概述 QwtPlotMarker类是Qwt绘图库中用于在图表上绘制标记的类。标记可以是垂直或水平线、直线、文本或箭头等。它可用于标记某个特定的位置、绘制参考线或注释信息。 以下是类继承关系图&#xff1a; 2.常用方法 设置标记的坐标。传入x和y坐标值&#xff0c;标记将被放置在…

【23种设计模式】接口隔离原则

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

电脑视频怎么转音频mp3

如果你在电脑上观看视频时喜欢上某个片段的背景音乐&#xff0c;且想将喜欢的背景音乐制作为手机铃声。我是建议你将此视频转换为 MP3 格式&#xff0c;因为 MP3 几乎与所有设备相兼容&#xff0c;让你可以在不同设备上不受限制地去聆听它。那该如何转换呢&#xff1f;无需担心…

vue路径中“@/“代表什么

举例&#xff1a; <img src"/../static/imgNew/adv/tupian.jpg"/>其中&#xff0c;/是webpack设置的路径别名&#xff0c;代表什么路径&#xff0c;要看webpack的build文件夹下webpack.base.conf.js里面对于是如何配置&#xff1a; 上图中代表src,上述代码就…

RabbitMQ 链接管理-发布者-消费者

RabbitMQ连接管理器 using RabbitMQ.Client; using System; public class RabbitMQConnectionManager { private readonly IConnectionFactory _connectionFactory; private IConnection _connection; public RabbitMQConnectionManager(string hostName) { …

LayerUI中按钮点击一次,触发了两次事件

form.on("submit(clericalServices)", function (data) {console.log("1111111");var getTpl clericalServicesT.innerHTML;laytpl(getTpl).render({}, function (html) {$("#type1Scope").append(html);});return false})点击一次&#xff0c;…

构建自动化测试环境:使用Docker和Selenium!

随着软件开发的日益复杂和迭代速度的加快&#xff0c;自动化测试被越来越广泛地应用于软件开发流程中。它能够提高测试效率、减少测试成本&#xff0c;并保证软件质量的稳定性。在构建自动化测试环境方面&#xff0c;Docker 和 Selenium 是两个非常有用的工具。下面将介绍如何使…

Python分享之多进程探索 (multiprocessing包)

在初步了解Python多进程之后&#xff0c;我们可以继续探索multiprocessing包中更加高级的工具。这些工具可以让我们更加便利地实现多进程。 进程池 进程池 (Process Pool)可以创建多个进程。这些进程就像是随时待命的士兵&#xff0c;准备执行任务(程序)。一个进程池中可以容…

CSS外边距重叠:原理、结果

引言 CSS中的外边距是控制元素间距的重要属性之一。然而&#xff0c;当涉及到相邻元素的外边距时&#xff0c;可能会出现外边距重叠的情况&#xff0c;这可能会对页面布局产生一些意想不到的影响。本文将深入探讨什么是外边距重叠以及它可能导致的结果&#xff0c;并提供一些代…

7-4、S加减速转动实现【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍实现步进电机S曲线运动的代码 一、目标功能 实现步进电机转动总角度720&#xff0c;其中加减速各90 加速段&#xff1a;加速类型&#xff1a;S曲线   加速角度&#xff1a;角度为90   起步速度&#xff1a;30RPM&#xff0c;   终止速度&#x…

【数智化人物展】同方有云联合创始人兼总经理江琦:云计算,引领数智化升级的动能...

江琦 本文由同方有云联合创始人兼总经理江琦投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 数据智能产业创新服务媒体 ——聚焦数智 改变商业 在这个飞速发展的数字时代&#xff0c;我们置身于一个前所未有的机遇与挑战并存的时刻。数字化转型不再仅仅是一…