【LeetCode】239. 滑动窗口最大值

news2024/10/6 14:36:25

239. 滑动窗口最大值

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

思路

  • 当我们遍历数组时,我们需要维护一个双端队列,用于存储滑动窗口中的元素的索引。 队列中的元素按照降序排列,即「队头元素是当前滑动窗口中的最大值」。

  • 具体的步骤如下:

    1. 创建一个双端队列 window,用于存储滑动窗口中的元素的索引
    2. 遍历整个数组,对于每个元素 nums[i]:
      • 如果「队列不为空」且「队头元素不在当前滑动窗口的范围内」,将队头元素从队列中删除,因为它已经不在滑动窗口中了。
      • 如果「队列不为空」且「当前元素 nums[i] 大于等于队尾元素所对应的数组元素 nums[window.back()] 」,将队尾元素从队列中删除,因为它不可能是滑动窗口中的最大值了。
      • 将当前元素的索引 i 加入队列的队尾
      • 如果当前遍历的索引 i 大于等于滑动窗口的大小 k-1,说明当前滑动窗口已经形成,将队头元素所对应的数组元素 nums[window.front()] 加入结果数组 ans中。
        返回结果数组 ans。
  • 通过以上的步骤,我们可以得到滑动窗口中的最大值。 这是因为队列中的元素按照降序排列,所以队列的队头元素即为当前滑动窗口中的最大值。

代码

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> ans;

        int n = nums.size();
        deque<int> windows;
        for(int i=0; i<n; ++i){
            // 如果队列不为空且队头元素不在当前滑动窗口的范围内
            // 将队头元素从队列中删除
            if(!windows.empty() && windows.front() <= i-k){
                windows.pop_front();
            }

            // 如果队列不为空且当前元素大于队尾元素,删除队尾元素
            while(!windows.empty() && nums[windows.back()] <= nums[i]){
                windows.pop_back();
            }

            // 当前元素入队
            windows.push_back(i);

            // 如果当前遍历的索引大于等于滑动窗口的大小
            // 将队头元素所对应的数组元素加入结果数组中
            if(i >= k-1){
                ans.push_back(nums[windows.front()]);
            }
        }
        return ans;
    }
};

参考资料

  1. 【动画模拟】一下就能搞懂的题解(单调双端队列)

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

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

相关文章

Spring Boot中的Elasticsearch自动配置:原理与使用

Spring Boot中的Elasticsearch自动配置&#xff1a;原理与使用 简介 在Spring Boot中&#xff0c;Elasticsearch是非常流行的搜索引擎。为了方便开发人员使用Elasticsearch&#xff0c;Spring Boot提供了Elasticsearch自动配置功能。本文将介绍Elasticsearch自动配置的原理与…

burpsuite踩坑(一)

今天在使用burpsuite的时候&#xff0c;能抓到https或者http的包。 但是repeater模块无法使用&#xff0c;而且放行包之后&#xff0c;会出现提示。 搞了半天&#xff0c;以为是证书的问题&#xff0c;或者是burp汉化版的原因&#xff0c;还把汉化版的burp给删除了。 发现都…

【Docker】基于jib插件,实现Docker部署springboot项目

文章目录 创建springboot项目jib插件介绍使用打tar包 Docker部署springboot项目 在工作中&#xff0c;作为一名后端开发人员&#xff0c;项目部署运维的事我们可能都要同时干&#xff0c;今天想跟大家聊聊关于springboot项目使用docker部署相关操作。后期还会跟大家分享docker-…

笔记-方向导数和梯度

笔记-方向导数和梯度 目录方向导数梯度方向导数和梯度的关系 目录 方向导数 方向导数和偏导数的区别就是&#xff1a;方向不同。仅此而已。 我们常说的偏导数无非就是对x轴求偏导&#xff0c;对y求偏导。而方向导数则是对x轴与y轴之间的某一新方向求导数。 还是用一下上次的…

大模型基础之注意力机制和Transformer

【注意力机制】 核心思想&#xff1a;在decoder的每一步&#xff0c;把encoder端所有的向量提供给decoder&#xff0c;这样decoder根据当前自身状态&#xff0c;来自动选择需要使用的向量和信息. 【注意力带来的可解释性】 decoder在每次生成时可以关注到encoder端所有位置的…

Llama大模型运行的消费级硬件要求【CPU|GPU|RAM|SSD】

大型语言模型 (LLM) 是强大的工具&#xff0c;可以为各种任务和领域生成自然语言文本。 最先进的LLM之一是 LLaMA&#xff08;大型语言模型 Meta AI&#xff09;&#xff0c;这是由 Facebook 的研究部门 Meta AI 开发的一个包含 650 亿个参数的模型 要在家运行 LLaMA 模型&…

详解LeafLet中如何展示GeoServer发布的图层组

目录 前言 一、关于图层组 1、使用图层图组的好处 2、创建图层组 二、在Leaflet中展示图层组 1、新建Html模板框架 2、绑定地图map和底图设置 3、绑定图层组 总结 前言 在之前的博文中&#xff0c;曾经重点介绍如何使用LeafLet叠加Geoserver wms图层到已有底图的方法 ,…

机器学习复习6

机器学习复习 1 - 在机器学习的背景下&#xff0c;什么是诊断(diagnostic)&#xff1f; A. 这指的是衡量一个学习算法在测试集(算法没有被训练过的数据)上表现如何的过程 B. 迅速尝试尽可能多的不同方法来改进算法&#xff0c;从而看看什么方法有效 C. 机器学习在医疗领域的应用…

上手vue2的学习笔记1之了解前端三剑客

纯小白学习前端开发&#xff0c;找学习资料也花费了一些时间&#xff0c;后续配置环境&#xff0c;也走了很多弯路&#xff0c;这里梳理一下这几天的学习资料&#xff0c;做一个简单的总结。 1.初步了解vue Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&a…

CountDownLatch基本使用及原理

CountDownLatch基本使用及原理 一、CountDownLatch简介二、CountDownLatch类的继承关系1. AbstractQueuedSynchronizer: 用于构建锁和同步器的框架。2. Sync: CountDownLatch的内部类&#xff0c;提供了锁的具体实现。 三、Semaphore的基本使用1. 使用场景&#xff1a;2. 代码实…

Unity3D:编辑属性

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 编辑属性 属性是用于游戏对象组件和资源的设置和选项。 可在 Inspector 窗口中编辑属性。 光源组件显示了各种值和引用属性 属性分为以下主要类别&#xff1a; 引用&#xff1a;…

Scrapy框架之Docker 安装 MongoDB

目录 Docker安装 MongoDB Docker 安装 MongoDB 第一次 MongoDB基础命令 算机存储数据的概念 查看数据库 切换数据库/创建数据库 删除当前数据库 创建集合 查看集合 删除集合 数据的增加 样例 数据的更新 举例 Docker安装 MongoDB Docker Docker 是一个开源的应…

ARM fiq和irq的区别 共享内存 混合联编 6.25

day4 汇编代码初始化系统中&#xff1a; 为什么要保存cpsr&#xff1a;要把其他的状态还原 如&#xff08;N Z&#xff09; user&#xff1a;mov r0,#3cmp r0,#4... //irqmovlt r1,#5irq:mov r0,#10cmp r0,#10moveq r2,#6fiq和irq的区别&#xff1a; fiq和irq的区别&#…

CVPR 2023 | SAN: Side Adapter Network for Open-Vocabulary Semantic Segmentation

CVPR 2023 | SAN: Side Adapter Network for Open-Vocabulary Semantic Segmentation 论文&#xff1a;https://arxiv.org/abs/2302.12242代码&#xff1a;https://github.com/MendelXu/SAN 架构设计 冻结的 CLIP&#xff0c;其位置编码为了适应不同于预训练的输入分辨率&…

贪心算法:解决最优问题的简洁而高效方法

目录 引言&#xff1a; 一. 概念与原理 二. 应用场景 3. 实现方法 4. 优缺点分析 引言&#xff1a; 在计算机科学领域&#xff0c;我们经常面临着需要在一系列选择中找到最优解决方案的问题。贪心算法正是针对这类最优化问题而设计的一种简洁而高效的方法。不同于其他复杂…

Educational Codeforces Round 151 (Rated for Div. 2)(A-B)

打完涨了20分…… 算法选修课就学会了dfs……如果有期末复习的这种劲头&#xff0c;其他算法估计早就学会了&#xff08; A Forbidden Integer 这个还WA了三发…… signed main(){IOS;int n,k,x;bool f1;cf{cin>>n>>k>>x;if(k1)cout<<"NO"…

Quiz 14_2-1: Using Web Services | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Quiz 14_2-1: Using Web Services单选题&#xff08;1-15&#xff09;操作题Autograder : Extracting Data from XML Python for Everybody 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This cou…

Echarts折线图默认不显示数据圆点,鼠标hover时折线图上才显示圆点

option {......tooltip: {trigger: axis,},series: [{symbol: circle,symbolSize: 5,showSymbol: false, // 只有在 tooltip hover 的时候显示symbolitemStyle: { // symbol样式normal: {color: rgb(255, 255, 255),borderColor: rgba(255, 255, 255, 0.2), // symbol边框颜色…

6.20、JAVA 初识序列化与反序列化

初识序列化与反序列化 1 概述 序列化是指将对象的状态信息转换为可以存储或传输形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后可以通过从存储区中读取或者反序列化对象的状态,重新创建该对象. 序列化:利用ObjectOutputStream,把对象的信息,按照固定…

【QT】如何自定义QMessageBox的窗口大小,通过继承QDialog重新实现美观的弹窗

目录 1. QMessageBox原有的弹窗2. 网上第一种方法&#xff1a;通过样式表setStyleSheet实现改变弹窗大小&#xff08;总体不美观&#xff09;3. 网上第二种方法&#xff1a;重写ShowEvent()改变弹窗大小&#xff08;总体也不美观&#xff09;4. 最好的办法&#xff1a;继承QDia…