当前位置: 首页 > news >正文

每日一题(LeetCode)----栈和队列--滑动窗口最大值

每日一题(LeetCode)----栈和队列–滑动窗口最大值

1.题目(239. 滑动窗口最大值)

  • 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

    返回 滑动窗口中的最大值

    示例 1:

    输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
    输出:[3,3,5,5,6,7]
    解释:
    滑动窗口的位置                最大值
    ---------------               -----
    [1  3  -1] -3  5  3  6  7       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7
    

    示例 2:

    输入:nums = [1], k = 1
    输出:[1]
    

    提示:

    • 1 <= nums.length <= 105
    • -104 <= nums[i] <= 104
    • 1 <= k <= nums.length

2.解题思路

思路一:使用优先队列

优先队列的底层实现是堆,默认是大顶堆

1.我们先创建一个优先队列底层是大顶堆的,便于我们维护最大值,且这个优先队列中的每一个元素都是二元组的(每一个二元组的元素的第一个表示的是数组中的一个数,第二个表示的是这个数在数组中对应的下标),便于我们之后将不在滑动窗口范围内的元素删除 然后再创建一个动态数组用来存每一个滑动窗口的最大值

2.初始时,我们先根据k变量的大小,把数组的前k个元素连带着它们的下标放入到优先队列中去

3.我们从第k+1个元素开始向后遍历,每遍历到一个元素,将当前元素连带着它的下标作为一个二元组元素放入到优先队列中去,然后将优先队列的首元素中存的下标与当前滑动窗口的左边界进行比较如果比左边界小那么就删除当前优先队列的首元素直到优先队列的首元素中存的下标比左边界大结束,然后将当前优先队列首元素存的值放入到动态数组中去,继续向后遍历

在滑动窗口中,在这种情况下,这个值在数组 nums\textit{nums}nums 中的位置出现在滑动窗口左边界的左侧。因此,当我们后续继续向右移动窗口时,这个值就永远不可能出现在滑动窗口中了,我们可以将其永久地从优先队列中移除。

我们不断地移除堆顶的元素,直到其确实出现在滑动窗口中。此时,堆顶元素就是滑动窗口中的最大值。

思路来源:力扣官方题解
链接:https://leetcode.cn/problems/sliding-window-maximum/

思路二:双向队列(单调队列)

1.我们先创建一个双向队列(单调队列),这个队列存的是数组中元素的下标,我们要保证这个队列中存的元素的下标对应的数是递减的,然后我们再创建一个动态数组用来存每一个滑动窗口的最大值

2.初始时,我们先根据k变量的大小,先对数组中前k个元素进行处理,当队列为空时,我们直接把当前遍历到的元素对应的下标放入到队列末尾,当队列不为空时,且当前遍历到的元素的值大于队列末尾下标所对应的数的值,那么我们删除队列的末尾元素,继续与队列末尾元素进行比较,直到当前遍历到的元素的值小于队列末尾下标所对应的数的值,我们将当前元素对应的下标放入到队列的末尾

3.我们从第k+1个元素开始向后遍历,每遍历到一个元素,看队列是否为空,当队列为空时,我们直接把当前遍历到的元素对应的下标放入到队列末尾,当队列不为空时,且当前遍历到的元素的值大于队列末尾下标所对应的数的值,那么我们删除队列的末尾元素,继续与队列末尾元素进行比较,直到当前遍历到的元素的值小于队列末尾下标所对应的数的值,我们将当前元素对应的下标放入到队列的末尾,再将队列的首元素的值与当前滑动窗口的左边界进行比较,如果比左边界小那么就删除当前队列的首元素直到队列的首元素的值比左边界大结束,然后将当前队列首元素在数组中对应的值放入到动态数组中去,继续向后遍历

思路来源:力扣官方题解
链接:https://leetcode.cn/problems/sliding-window-maximum/

3.写出代码

思路一的代码

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {priority_queue<pair<int,int>> q;int n=nums.size();for(int i=0;i<k;i++){q.emplace(nums[i],i);}vector<int> ans={q.top().first};for(int i=k;i<n;i++){q.emplace(nums[i],i);while(q.top().second<=i-k){q.pop();}ans.push_back(q.top().first);}return ans;}
};
思路来源:力扣官方题解
链接:https://leetcode.cn/problems/sliding-window-maximum/

思路二的代码

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int> q;int n=nums.size();for(int i=0;i<k;i++){while(!q.empty()&&nums[i]>=nums[q.back()]){q.pop_back();}q.push_back(i);}vector<int> ans={nums[q.front()]};for(int i=k;i<n;i++){while(!q.empty()&&nums[i]>=nums[q.back()]){q.pop_back();}q.push_back(i);while(q.front()<=i-k){q.pop_front();}ans.push_back(nums[q.front()]);}return ans;}
};
思路来源:力扣官方题解
链接:https://leetcode.cn/problems/sliding-window-maximum/

相关文章:

每日一题(LeetCode)----栈和队列--滑动窗口最大值

每日一题(LeetCode)----栈和队列–滑动窗口最大值 1.题目&#xff08;239. 滑动窗口最大值&#xff09; 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 …...

13.bash shell中的if-then语句

文章目录 shell中的流控制if语句if语句if-then语句if-then-else 语句 test命令数值比较字符串比较文件比较case语句 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; shell中的流控制if语句 简单的脚本可以只包含顺序执行的命令&#xff0…...

深入了解 Python 的 import 语句

在 Python 中&#xff0c;import 语句是一个关键的功能&#xff0c;用于在程序中引入模块和包。本文将深入讨论 import 语句的各种用法、注意事项以及一些高级技巧&#xff0c;以帮助你更好地理解和使用这一功能。 概念介绍 package 通常对应一个文件夹&#xff0c;下面可以有…...

接口测试 — 11.logging日志模块处理流程

1、概括理解 了解了四大组件的基本定义之后&#xff0c;我们通过图示的方式来理解下信息的传递过程&#xff1a; 也就是获取的日志信息&#xff0c;进入到Logger日志器中&#xff0c;传递给处理器确定要输出到哪里&#xff0c;然后进行过滤器筛选&#xff0c;通过后再按照定义…...

Hago 的 Spark on ACK 实践

作者&#xff1a;华相 Hago 于 2018 年 4 月上线&#xff0c;是欢聚集团旗下的一款多人互动社交明星产品。Hago 融合优质的匹配能力和多样化的垂类场景&#xff0c;提供互动游戏、多人语音、视频直播、 3D 虚拟形象互动等多种社交玩法&#xff0c;致力于为用户打造高效、多样、…...

mac传输文件到windows

前言 由于mac系统与windows系统文件格式不同&#xff0c;通过U盘进行文件拷贝时&#xff0c;导致无法拷贝。官方解决方案如下&#xff0c;但是描述的比较模糊。看我的操作步骤即可。 https://support.apple.com/zh-cn/guide/mac-help/mchlp1657/12.0/mac/12.6 前提条件 mac与…...

trtc-electron-sdk的demo中添加更新功能以及出现的报错问题

1、官网demo下载地址 点击下载 按照官网demo说明文档进行安装和运行 2、添加electron-updater npm install electron-updater根据项目需求安装对应的版本&#xff0c;建议使用5.2.1 3、创建一个handleUpdater.js文件&#xff0c;和package.json同级 // const { ipcMain } …...

什么是流量攻击? 流量攻击怎么处理?

由于DDoS攻击往往采取合法的数据请求技术&#xff0c;再加上傀儡机器&#xff0c;造成DDoS攻击成为最难防御的网络攻击之一。据美国最新的安全损失调查报告&#xff0c;DDoS攻击所造成的经济损失已经跃居第一。 传统的网络设备和周边安全技术&#xff0c;例如防火墙和IDSs(Intr…...

【大数据】NiFi 的基本使用

NiFi 的基本使用 1.NiFi 的安装与使用1.1 NiFi 的安装1.2 各目录及主要文件 2.NiFi 的页面使用2.1 主页面介绍2.2 面板介绍 3.NiFi 的工作方式3.1 基本方式3.2 选择处理器3.3 组件状态3.4 组件的配置3.4.1 SETTINGS&#xff08;通用配置&#xff09;3.4.2 SCHEDULING&#xff0…...

5 分钟内搭建一个免费问答机器人:Milvus + LangChain

搭建一个好用、便宜又准确的问答机器人需要多长时间&#xff1f; 答案是 5 分钟。只需借助开源的 RAG 技术栈、LangChain 以及好用的向量数据库 Milvus。必须要强调的是&#xff0c;该问答机器人的成本很低&#xff0c;因为我们在召回、评估和开发迭代的过程中不需要调用大语言…...

WPF Border

在 WPF 中&#xff0c;Border 是一种常用的控件&#xff0c;用于给其他控件提供边框和背景效果。 要使用 Border 控件&#xff0c;您可以在 XAML 代码中添加以下代码&#xff1a; <Border BorderBrush"Black" BorderThickness"2" Background"Lig…...

基于博弈树的开源五子棋AI教程[4 静态棋盘评估]

引子 静态棋盘的评估是棋力的一个很重要的体现&#xff0c;一个优秀的基于博弈树搜索的AI往往有上千行工作量&#xff0c;本文没有做深入讨论&#xff0c;仅仅写了个引子用来抛砖引玉。 评估一般从两个角度入手&#xff0c;一个是子力&#xff0c;另一个是局势。 1 评估维度 …...

STL--排序与检索

题目 现有N个大理石&#xff0c;每个大理石上写了一个非负整数。首先把各数从小到大排序&#xff0c;然后回答Q个问题。每个问题是否有一个大理石写着某个整数x,如果是&#xff0c;还要回答哪个大理石写着x。排序后的大理石从左到右编写为1-N。&#xff08;样例中&#xff0c;…...

大数据处理与分析-Spark

导论 (基于Hadoop的MapReduce的优缺点&#xff09; MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架 MapReduce是一种用于处理大规模数据集的编程模型和计算框架。它将数据处理过程分为两个主要阶段&#xff1a;Map阶…...

虚拟机的下载、安装(模拟出服务器)

下载 vmware workstation&#xff08;收费的虚拟机&#xff09; 下载vbox 网址&#xff1a;Oracle VM VirtualBox&#xff08;免费的虚拟机&#xff09; 以下选择一个下载即可&#xff0c;建议下载vbox&#xff0c;因为是免费的。安装的时候默认下一步即可&#xff08;路径最好…...

K8S Pod Terminating/Unknown故障排查

一、pod异常出现现象 优雅终止周期(Graceful termination period): 当pod被删除时&#xff0c;会进入"Terminating"状态&#xff0c;等待容器优雅关闭。如果容器关闭所需时间超过默认期限(默认30秒)&#xff0c;则pod将保持在"Terminating"状态。 Finalize…...

labelme标注的json文件数据转成coco数据集格式(可处理目标框和实例分割)

这里主要是搬运一下能找到的 labelme标注的json文件数据转成coco数据集格式&#xff08;可处理目标框和实例分割&#xff09;的代码&#xff0c;以供需要时参考和提供相关帮助。 1、官方labelme实现 如下是labelme官方网址&#xff0c;提供了源代码&#xff0c;以及相关使用方…...

MySQL报错:1366 - Incorrect integer value: ‘xx‘ for column ‘xx‘ at row 1的解决方法

我在插入表数据时遇到了1366报错&#xff0c;报错内容&#xff1a;1366 - Incorrect integer value: Cindy for column name at row 1&#xff0c;下面我演示解决方法。 根据上图&#xff0c;原因是Cindy’对应的name字段数据类型不正确。我们在左侧找到该字段所在的grade_6表&…...

MySQL中MVCC的流程

参考文章一 参考文章二 当谈到数据库的并发控制时&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一个重要的概念。MVCC 是一种用于实现数据库事务隔离性的技术&#xff0c;常见于像 PostgreSQL 和 Oracle 这样的数据库系统中。 MVCC 的核心思想是为每个数据行维护…...

朴素贝叶斯法_naive_Bayes

朴素贝叶斯法&#xff08;naive Bayes&#xff09;是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集&#xff0c;首先基于特征条件独立假设学习输入输出的联合概率分布&#xff1b;然后基于此模型&#xff0c;对给定的输入 x x x&#xff0c;利用贝叶斯定理…...

Unity坐标系实战解析:从localPosition到Position的层级关系与应用场景

1. 理解Unity中的坐标系基础 在Unity开发中&#xff0c;坐标系系统是构建3D世界的基石。很多新手开发者容易混淆localPosition和Position的概念&#xff0c;导致物体位置控制出现各种"灵异现象"。我们先从一个生活场景来理解&#xff1a;想象你站在客厅里&#xff08…...

复盘与导出工具V9.0新功能实测:竞价选股与Excel导出最强风口全攻略

复盘与导出工具V9.0深度实战&#xff1a;解锁竞价选股与Excel导出的高阶玩法 对于股票分析爱好者来说&#xff0c;工具的每一次重大更新都意味着效率的跃升。V9.0版本带来的竞价选股条件设置和最强风口Excel导出两大功能&#xff0c;正在重新定义短线交易的数据处理方式。本文将…...

VCAM虚拟摄像头:革新移动设备视觉交互的技术探索

VCAM虚拟摄像头&#xff1a;革新移动设备视觉交互的技术探索 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam VCAM虚拟摄像头是一款基于Xposed框架的安卓应用&#xff0c;通过HOOK技术&…...

LightOnOCR-2-1B部署指南:快速搭建你的私有OCR识别服务

LightOnOCR-2-1B部署指南&#xff1a;快速搭建你的私有OCR识别服务 1. 认识LightOnOCR-2-1B 你是否遇到过需要从大量图片中提取文字的场景&#xff1f;比如扫描的合同、拍照的会议记录&#xff0c;或者历史档案数字化&#xff1f;传统的OCR解决方案要么识别准确率不高&#x…...

4个步骤掌握ComfyUI-WanVideoWrapper:从环境搭建到视频生成全攻略

4个步骤掌握ComfyUI-WanVideoWrapper&#xff1a;从环境搭建到视频生成全攻略 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper ComfyUI-WanVideoWrapper是一款强大的AI视频生成插件&#xff0c;作…...

Android开发工具链:Git、RxJava、Dagger2的实战应用

Android开发工具链&#xff1a;Git、RxJava、Dagger2的实战应用 【免费下载链接】android-interview-questions-cn 项目地址: https://gitcode.com/gh_mirrors/an/android-interview-questions-cn Android开发工具链是提升开发效率和代码质量的关键。本文将详细介绍Git…...

Flutter Spinkit贡献指南:如何为开源项目添加新动画组件

Flutter Spinkit贡献指南&#xff1a;如何为开源项目添加新动画组件 【免费下载链接】flutter_spinkit ✨ A collection of loading indicators animated with flutter. Heavily Inspired by http://tobiasahlin.com/spinkit. 项目地址: https://gitcode.com/gh_mirrors/fl/f…...

百度网盘直链解析技术全解析:从原理到实践的开源解决方案

百度网盘直链解析技术全解析&#xff1a;从原理到实践的开源解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 1. 问题本质&#xff1a;云存储限速的技术困局 1.1 限速…...

Youtu-VL-4B-Instruct效果可视化:热力图呈现视觉词注意力与文本对齐关系

Youtu-VL-4B-Instruct效果可视化&#xff1a;热力图呈现视觉词注意力与文本对齐关系 1. 引言&#xff1a;当模型“看见”并“思考”时&#xff0c;它在看哪里&#xff1f; 想象一下&#xff0c;你给一个AI模型看一张照片&#xff0c;然后问它&#xff1a;“图片里有什么&…...

不只是图表:用Three.js和Vue3打造一个可交互的3D热力图组件库(附完整源码)

不只是图表&#xff1a;用Three.js和Vue3打造一个可交互的3D热力图组件库 在数据可视化领域&#xff0c;3D热力图正逐渐成为展示高密度空间数据的首选方案。传统2D热力图虽然直观&#xff0c;但在表现复杂数据关系时往往力不从心。本文将带您从零开始构建一个生产级Vue3Three.j…...