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

news/2025/2/23 6:19:41

239. 滑动窗口的最大值

单调队列的模板题,但是我一直记不住😢。

题目描述如下:

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

返回 滑动窗口中的最大值 。

输入输出示例及数据范围:
在这里插入图片描述

思路

下面所给的思路不是单调队列的分析思路,而是如何使用单调队列来解决这道题目的思路。

单调队列顾名思义,队列当中的数据可以按照某种顺序形成单调性,比如从队头到队尾数据是单调递减的。解决这道题目正是利用到了这一条性质,即队列当中元素按照整型数据的大小递减。

我们需要维护一个双端队列(比如 C++ 当中的 deque),双端队列当中存储的值是原数组的下标,存储下标的好处有两点,第一点就是可以直接通过下标索引原数组得到数据的值,第二点是可以判断当前下标是否超出了滑动窗口的范围,如果超出了就把这条数据踢出去。

现在我们开始对数组进行遍历。首先对于一个新来的数据,为了维持单调队列的有序性,我们需要不断地判断当前元素和队尾元素谁大谁小,如果队尾下标对应的元素不比当前元素大,那么此时将当前元素插入到队尾不能保持单调队列的单调性,遂将当前的队尾踢出队列(直接 pop_back)。不断地进行比较直到当前队尾下标索引到的数据比当前数据要大,将当前数据的下标排在队尾即可,或是队列被清空(意味着当前队列中所有的数据都不比当前元素更大,为了维护双端队列的单调性,当前元素被作为队首元素【即最大值】插入到了队列当中)。

插入元素之后,现在我们开始维护本题所使用的单调队列的第二条性质,即队列当中的元素不能是过期的(即:队列当中的元素应该在滑动窗口的范围内)。维护这条性质非常的简单,只需要不断地查看队首元素(还记得嘛?队列当中存储的是下标)与当前下标的差值是否大于滑动窗口的大小 k 即可。如果队首的元素过期,那么将队首的元素踢出即可(直接 pop_front)。

维护好双端队列之后,现在我们可以将当前元素的下标插入到队尾(push_back)。此时该元素插入的位置一定是合法的。

最后保存答案,只有当当前遍历的下标 i ≥ k − 1 i\geq k - 1 ik1 的时候,队首元素(是下标)索引到的值才能加入到答案当中,因为此时单调队列的长度恰好与滑动窗口一致。

C++ 实现

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

        int n = nums.size();
        for(int i=0; i<n; i++) {
            while(dq.size() && nums[dq.back()] < nums[i])   dq.pop_back();
            while(dq.size() && i - dq.front() >= k)         dq.pop_front();
            dq.push_back(i);
            if(i >= k - 1) {
                ans.push_back(nums[dq.front()]);
            }
        }

        return ans;
    }
};

http://www.niftyadmin.cn/n/5863100.html

相关文章

使用ArcGIS Pro自动矢量化水系

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;自动矢量化是一项至关重要的技术&#xff0c;它能够将栅格图像中的要素转换为矢量数据&#xff0c;从而方便后续的分析和处理。本文将详细介绍如何使用ArcGIS Pro自动矢量化水系&#xff0c;适用于那些颜色相对统一、…

探索YOLO技术:目标检测的高效解决方案

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…

DVWA 靶场

DVWA 靶场的通关 刚建立和使用 输入 http://dvwa:8898/setup.php //进入用户名 密码 dvwa 你自己设计的想要进入数据库 点击creat 用户名 密码 admin passwordAttack type Sniper模式 在Sniper模式下&#xff0c;Payload字典用于逐个替换请求中标记的位置。例如&#x…

华为发力中端,上半年nova14下半年nova15,大力普及原生鸿蒙

在智能手机市场的激烈竞争中&#xff0c;华为始终以创新者的姿态不断突破。2025年&#xff0c;华为在中端手机领域投下两颗重磅炸弹——上半年推出nova14系列&#xff0c;下半年接力发布nova15系列&#xff0c;且全系搭载原生鸿蒙系统&#xff0c;售价覆盖2000-4000元价格带&am…

【Java】File 类

目录 File 类File 类构造方法常见成员方法判断与获取创建与删除获取并遍历 File 类 File 对象表示一个路径&#xff0c;可以是文件的路径&#xff0c;也可以是文件夹的路径 这个路径可以是存在的&#xff0c;也允许是不存在的 绝对路径和相对路径的区别&#xff1a; 绝对路径…

Redis实战篇《黑马点评》5

5.秒杀优化 5.1异步秒杀思路 我们先来回顾一下下单流程 当用户发起请求&#xff0c;此时会先请求Nginx&#xff0c;Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分为如下几个步骤 查询优惠券判断秒杀库存是否足够查询订单校验是…

OpenAI 周活用户破 4 亿,GPT-4.5 或下周发布,微软加紧扩容服务器

导语&#xff1a; OpenAI 近期用户增长迅猛&#xff0c;其下一代 AI 模型 GPT-4.5 和 GPT-5 的发布也日益临近。微软作为 OpenAI 的重要合作伙伴&#xff0c;正积极扩充服务器容量&#xff0c;为新模型的到来做好准备。 OpenAI 首席运营官布拉德莱特卡普&#xff08;Brad Lig…

Chrome 浏览器(版本号49之后)‌解决跨域问题

谷歌浏览器解决跨域问题 如何查看 Chrome 浏览器版本号 打开 Chrome 浏览器点击右上角的三个点&#xff0c;打开“设置”页面 点击“关于Chrome” 查看版本号 解决跨域操作&#xff1a;windows系统为例 方法一&#xff1a;命令行启动方式&#xff08;最简单&#xff09; …