【滑动窗口】力扣239.滑动窗口最大值

前面的文章我们练习数十道 动态规划 的题目。相信小伙伴们对于动态规划的题目已经写的 得心应手 了。

还没看过的小伙伴赶快关注一下,学习如何 秒杀动态规划 吧!

接下来我们开启一个新的篇章 —— 「滑动窗口」

滑动窗口

滑动窗口 是一种基于 双指针 思想的算法。两个指针指向的元素之间会形成一个窗口,从前往后遍历元素进行一定的运算。

从名字中也不难看出:滑动 说明窗口的大小并不是固定不变的。通过左右指针按照 规则 向前滑动形成的不同大小的窗口解决具体的问题。

因此,分析问题的 关键 就在于 明确两个指针的移动规则

核心步骤

  1. 初始时,L = R = 0 ,并规定窗口的取值为 [L, R) 即:左闭右开 。因此,初始时[0, 0) 无意义,窗口内没有任何元素被包含。

  2. 循环遍历,在保证不会越界的情况下,不断 增大右指针R。当满足要求后,停止增大右指针R

  3. 左指针L开始 不断增大,直到不满足要求后停下。

  4. 重复执行 2、3 两步,直到右指针R走到尽头( 越界 )。

左右指针轮流向前移动,窗口大小不断变化。新旧元素加入和移出后,及时更新该窗口范围内的相关数据。当执行结束后,收集到了所有符合要求的数据,且时间复杂度降低到了 O ( N ) O(N) O(N)


下面我们通过一道 力扣 Hard 题 进行学习。

239. 滑动窗口最大值

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


在解决该题目之前,我们先来讨论一下这类题的套路。

思路与套路

对于 窗口内最大最小值 的题目,我们采用 双端队列 的结构进行思考。并对 出队入队 进行这样的规定(以窗口内的最大值举例):

队列含义:
  1. 如果此时开始缩窗口(即:L++),哪些值会依次成为此时窗口内的最大值。
  2. 要求,队列中的元素从大到小排列。
队列的出入:

队尾 的出队与入队:

  • 如果队空,直接入队;
  • 否则,如果队尾位置不大于当前来到位置的数,从队尾出队。直到队尾元素大于当前位置元素,从队尾入队。

队头 的出队:

  • 当窗口缩小时,若队头元素已经不在当前的窗口中时,从队头弹出即可。

是不是没搞懂在说什么,没关系。我们通过具体的例子感受该流程:

就拿例 1 的例子,nums=[1,3,-1,-3,5,3,6,7],构造双端队列的值依次为:

注意: 双端队列中 队头元素 保存的是 当前范围最大值

先看从队尾出入队的情况:



以上均是 L 不动,R 在右移的情况。

再看从队头出队的情况:

下面我们再来看 L 也向右移动的情况:

L 指向 1,R 指向 5 时为例:


跟着图细心体会该过程哦!相信小伙伴能够理解双端队列的出入规则了!


下面我们回归正题,解决上面力扣 滑动窗口最大值 的题目。

仔细思考后发现,其实就是将上面的过程 加以限制

限制了窗口的大小必须为 k 。

直接上代码。

代码

public static int[] getMaxWindow(int[] arr, int w) {
    if (arr == null || w < 1 || arr.length < w) {
        return null;
    }
    // 双端队列
    LinkedList<Integer> qmax = new LinkedList<Integer>();
    int N = arr.length;
    // 最终会产生 N - w + 1 个结果
    int[] res = new int[N - w + 1];
    // res 数组的下标
    int index = 0;
    // R 从左到右遍历数组,不回退
    for (int R = 0; R < N; R++) {
        // 双端队列中有值,并且 队尾的数 比当前的 小 就弹出
        while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[R]) {
            qmax.pollLast();
        }
        // 双端队列为空,或者弹出完比自己小的数了
        // 从末尾插入队列中
        qmax.addLast(R);
        // R-w 是过期的下标,即 L 的位置
        // 队头的下标 过期了就弹出
        if (qmax.peekFirst() == R - w) {
            qmax.pollFirst();
        }
        // 能够形成完整的窗口了,开始往 结果数组 里填最终答案
        if (R >= w - 1) {
            res[index++] = arr[qmax.peekFirst()];
        }
    }
    return res;
}

代码解释

其实注释已经写的非常清楚了。

  1. 在上面的图中,我么在双端队列中放入的是 元素值,但在实际的代码中,存入的是下标,这样的话既能够比较大小,又能方便的进行入队出队操作。
  2. 窗口大小固定,R 和 L 一起右移。因此若判断出队头元素已经离开了窗口,就要弹出。
  3. 刚开始,R 从 0 开始增大,窗口还未形成。只有当形成 k 大小的窗口后再开始更新答案。(那 思考一下 为什么不直接从下标 k 开始呢?这不直接就有窗口了么?欢迎留言评论 ~)

~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!

关注回复「ACM紫书」获取 ACM 算法书籍~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉——P2PNet基于点估计的人群计数原理与C++模型推理

简介 人群计数是计算机视觉领域的一个核心任务&#xff0c;旨在估算静止图像或视频帧中的行人数量。在过去几十年中&#xff0c;研究人员在这个领域投入了大量的精力&#xff0c;并在提高现有主流基准数据集性能方面取得了显著进展。然而&#xff0c;训练卷积神经网络需要大规…

.net6Api后台+uniapp导出Excel

之前的这个是vue3写法&#xff0c;后端是.net6Api.net6Api后台VUE3前端实现上传和下载文件全过程_vue3 下载文件-CSDN博客 在现在看来似乎搞的复杂了&#xff0c;本次记录一下.net6Api后台uniapp导出Excel。 后端和之前的不一样&#xff0c;前端也和之前的不一样&#xff0c;…

鸿蒙培训开发:就业市场的新热点~

金三银四在即&#xff0c;随着春节假期结束&#xff0c;各行各业纷纷复工复产&#xff0c;2024年的春季招聘市场也迎来了火爆的局面。最近发布的《2024年春招市场行情周报&#xff08;第一期&#xff09;》显示&#xff0c;尽管整体就业市场仍处于人才饱和状态&#xff0c;但华…

IPsec VPN之安全联盟

一、何为安全联盟 IPsec在两个端点建立安全通信&#xff0c;此时这两个端点被称为IPsec对等体。安全联盟&#xff0c;即SA&#xff0c;是指通信对等体之间对某些要素的约定&#xff0c;定义了两个对等体之间要用何种安全协议、IP报文的封装方式、加密和验证算法。SA是IPsec的基…

Linux高级IO之poll

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、poll函数接口 1.接口 2.poll做了什么工…

2024 年中国高校大数据挑战赛赛题 C:用户对博物馆评论的情感分析完整思路以及源代码分享

博物馆是公共文化服务体系的重要组成部分。国家文物局发布&#xff0c; 2021 年我国新增备案博物馆 395 家&#xff0c;备案博物馆总数达 6183 家&#xff0c;排 名全球前列&#xff1b;5605 家博物馆实现免费开放&#xff0c;占比达 90%以上&#xff1b;全国 博物馆举办展览 3…

docker 子网

当需要给容器分配指定 ip &#xff0c;为避免ip 冲突&#xff0c;指定容器子网处理 创建 subnet 子网 docker network create --subnet 10.0.0.0/24 --gateway 10.0.0.1 subnet-testdocker network ls NETWORK ID NAME DRIVER SCOPE ... f582ecf297bc sub…

【杂记】IDEA和Eclipse如何查看GC日志

1.Eclipse查看GC日志 1.1 右击代码编辑区 -> Run As -> Run Configurations 1.2 点击Arguments栏 -> VM arguments:区域填写XX参数 -> Run 1.3 控制台输出GC详细日志 2.IDEA查看GC日志 2.1 鼠标右击代码编辑器空白区域&#xff0c;选择Edit 项目名.main()... 2.…

Mysql命令行客户端

命令行客户端 操作数据库操作数据表 操作数据库 mysql> create database mike charsetutf8; Query OK, 1 row affected (0.01 sec) mysql> show databases; -------------------- | Database | -------------------- | information_schema | | mike …

【C语言】linux内核tcp_write_xmit和tcp_write_queue_purge

tcp_write_xmit 一、讲解 这个函数 tcp_write_xmit 是Linux内核TCP协议栈中的一部分&#xff0c;其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部&#xff0c;确保只要远程窗口有空间&#xff0c;就可以发送数据。 下面是对该函数的一些主要逻辑的中…

实验二(一):IPV4编址及IPV4路由基础实验

一实验介绍 1.关于本实验 IPv4( Internet Protocol Version 4)是 TCP/IP 协议族中最为核心的协议之一。 它工作在 TCP/IP参考模型的网际互联层&#xff0c;该层与 OSI参考模型的网络层相对应。 网络层提供了无连接数据传输服务&#xff0c;即网络在发送分组时不需要先建立连…

算法设计与分析(超详解!) 第一节 算法概述

1.算法的定义 算法的非形式化定义&#xff1a;算法是规则的有限集合&#xff0c;是为解决特定问题而规定的一系列操作。 可以理解为&#xff1a;算法&#xff08;algorithm&#xff09;是指在解决问题时&#xff0c;按照某种机械的步骤一定可以得到问题的结果&#xff08;有的…

数学建模-动态规划(美赛运用)

动态规划模型的要素是对问题解决的抽象&#xff0c;其可分为&#xff1a; 阶段。指对问题进行解决的自然划分。例如&#xff1a;在最短线路问题中&#xff0c;每进行走一步的决策就是一个阶段。 状态。指一个阶段开始时的自然状况。例如&#xff1a;在最短线路问题中&#xff…

嵌入式Qt 制作一个登录对话框

一.登录对话框需求分析 二.代码实现 main.c&#xff1a; #include <QtGui/QApplication> #include "widget.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }Widget.h&#xff1a; #ifndef _WIDGET_H_…

EDA软件

EDA软件 EDA概念IC类EDA&#xff08;芯片EDA软件&#xff09;数字芯片和模拟芯片的区别模拟芯片产品种类IC设计类数字电路设计模拟电路设计 IC制造类IC封装类 PCB类EDA&#xff08;板级EDA软件&#xff09;Mentor公司板级EDACadence公司板级EDAAltium公司&#xff08;已被日本瑞…

bug_java

文章目录 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本52. Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0 1.创建Maven时&#xff1a; idea报错为&#xff1a;java&#xff1a;错误&#xff1a;不支持发行版本…

贪吃蛇(C语言实现)

贪食蛇&#xff08;也叫贪吃蛇&#xff09;是一款经典的小游戏。 —————————————————————— 本博客实现使用C语言在Windows环境的控制台中模拟实现贪吃蛇小游戏。 实行的基本功能&#xff1a; • 贪吃蛇地图的绘制 • 蛇吃食物的功能&#xff08;上、…

【重新定义matlab强大系列十七】Matlab深入浅出长短期记忆神经网络LSTM

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

Netty Review - 探究Netty服务端主程序无异常退出的背后机制

文章目录 概述故障场景尝试改进问题分析铺垫&#xff1a; Daemon线程Netty服务端启动源码分析逻辑分析 如何避免Netty服务端意外退出最佳实践 概述 在使用Netty进行服务端程序开发时&#xff0c;初学者可能会遇到各种问题&#xff0c;其中之一就是服务端意外退出的问题。这种问…

基于机器学习的工业用电量预测完整代码数据

视频讲解: 毕业设计:算法+系统基于机器学习的工业用电量预测完整代码数据_哔哩哔哩_bilibili 界面展示: 结果分析与展示: 代码: from sklearn import preprocessing import random from sklearn.model_selection import train_test_split from sklearn.preprocessing…