滑动窗口的最大值【滑动窗口问题】

news2025/1/17 6:03:41

文章目录

    • 题目
    • 解题思路
    • 代码展示

题目

给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,窗口从最左边滑动到最右边,每次向右边滑动一个位置,找出所有滑动窗口里数值的最大值。

窗口大于数组长度或窗口长度为0的时候,返回空

数据范围: 1 ≤ n ≤ 10000,0 ≤ size ≤ 10000,数组中每个元素的值满足∣val∣ ≤ 10000

要求:空间复杂度 O(n),时间复杂度 O(n)

例如:

在这里插入图片描述

该例子中,数组长度为 n(8),窗口大小为 size(5),一共产生了 n - size + 1(4)个窗口与的最大值

最后返回的列表结果是 {5,5,6,7}

解题思路

该题使用到的数据结构就是双端队列,双端队列,顾名思义,就是一个队列,并且在该队列中元素可以从队尾添加删除获取,也可以从队头添加删除获取

双端队列中存储的是元素的下标,并且规定下标在数组中对应的值在双端队列中从头到尾保持严格的单调递减,所以在窗口形成时队列头部的下标就是当前窗口的最大值
在这里插入图片描述

当前队列为空,因此直接将下标 0 从队尾添加到队列中

在这里插入图片描述

由于该队列保持严格降序,1 下标的值 3 没有比 0 下标的值 4 大,因此,直接从队尾添加到队列中

在这里插入图片描述

此时,2 下标的对应的值 5,比 1 下标对应的值 3 大,因此下标 1 从队尾弹出,下标 0 也是如此,遵守这样的规定,依次遍历

在这里插入图片描述

终于,R >= size - 1,表示窗口正式形成了,此时队首的下标对应的元素就是当前窗口的最大值,添加到返回列表当中

接下来滑动窗口就要向右开始滑动了,L 和 R 都要向右开始移动一格,下标 0 过期了,如果队首是下标 0,那就该出队列了,如果不是,那无事发生

在这里插入图片描述

虽然下标 4 和下标 5 处的元素同为 3,但是下标 5更加晚过期,可以保留更久,所以下标 4 就没有保留的价值了,从队尾弹出。队头的下标未过期,将其值添加到返回列表中

最后获取到列表 {5,5,6,7}

每个元素下标只会进队列一次,出队列一次,所以时间复杂度为 O(N),因为使用到了双端队列,空间复杂度为 O(N)

代码展示

public ArrayList<Integer> maxInWindows(int [] num, int size) {
    ArrayList<Integer> list = new ArrayList<>();
    if(size == 0 || size > num.length) {
        return list;
    }
    Deque<Integer> deque = new LinkedList<>();
    for(int i = 0;i < num.length;i ++) {
        while(!deque.isEmpty() && num[deque.peekLast()] <= num[i]) {
            deque.pollLast();//不满足严格递减,弹出
        }
        deque.addLast(i);//添加元素
        //队列顶部如果是过去下标就出队列
        if(deque.peekFirst() == i-size) {
            deque.pollFirst();
        }
        //窗口正式形成
        if(i >= size-1) {
            list.add(num[deque.peekFirst()]);
        }
    }
    return list;
}

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

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

相关文章

硬件需知知识 -- 基本元件(电阻)

一、电阻 1.1 贴片电阻 1.1.1 贴片电阻的封装大小是和功率时相关的。 封装大小功率(W)0201120\frac{1}{20}201​0402116\frac{1}{16}161​0603110\frac{1}{10}101​080518\frac{1}{8}81​12060.2518120.5或1201012\frac{1}{2}21​25121或者21.1.2 贴片电阻读数 贴片电阻的读数…

Spring Security 竟然可以同时存在多个过滤器链?

目录Spring Security 中的过滤器多个过滤器链多个过滤器链配置例子http.authorizeRequests() 开头是什么意思&#xff1f;引用Spring Security 中的过滤器 Spring Security 中认证、授权功能的实现机制是通过过滤器来实现的。Spring Security 中一共提供了 32 个过滤器&#x…

Nacos集群版本安装(三)

一、前言 注&#xff1a;我这里的nacos集群安装环境使用的是本地MacOs系统&#xff0c;使用的是同一个IP不同端口&#xff0c;这里就不再讲解具体的目录结构之内的了&#xff0c;下面我们开始演示具体的配置和安装。了解nacos单机版本安装 二、nacos集群安装部署&#xff1a; …

Redis常见面试题(二)

目录 1、Redis和Memcached有什么区别? 2、Redis支持哪些数据类型? 3、Redis支持JSON数据类型吗?为什么? 4、Redis模块系统有什么用? 5、Redis支持对象映射模型吗? 6、Redis默认支持多少个数据库?怎么修改? 7、Redis SET命令可以代替SETNX吗? 8、Redis单个实例最…

【浅学Java】索引的分类、创建、删除以及新特性

索引的创建和设计原则1. 索引的分类1.1 普通索引1.2 唯一性索引1.3 主键索引1.4 单列索引1.5 多列&#xff08;联合&#xff0c;组合&#xff09;索引1.6 全文索引2. 索引的创建2.1 创建表时创建索引1. 隐式创建2. 显式创建3. 全文检索2.2 创建表后创建索引1. alter table 的方…

基于java(ssm)家教管理平台(java毕业设计)

基于java&#xff08;ssm&#xff09;家教管理平台 家教管理&#xff0c;是基于java变成语言&#xff0c;mysql数据库&#xff0c;ssm框架和idea工具开发&#xff0c;本系统分为用户&#xff0c;管理员&#xff0c;教师三个角色&#xff0c;其中用户可以注册&#xff0c;登陆&…

网络工程师之海明校验

海明校验&#xff08;又称汉明码&#xff09; 基本思想 将有效信息按某种规律分成若干组&#xff0c;每组安排一个校验位&#xff0c;做奇偶测试&#xff0c;就能提供多位检错信息&#xff0c;以指出最大可能是哪位出错&#xff0c;从而将其纠正。 特点 它不仅具有检测错误的…

深入浅出网络编程TCP,UDP,Socket,Http网络编程面试题

目录 什么是网络编程 网络编程中的主要问题 计算机网络体系结构 TCP / UDP Socket HTTP 什么是网络编程 网络编程中的主要问题 计算机网络体系结构 OSI参考模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互联。一般都叫OSI参考模型&…

Geoserver提示HTTP ERROR 503 Service Unaviaiable以及Context initialization failed

场景 GeoServer简介、下载、配置启动、发布shapefile全流程(图文实践)&#xff1a; GeoServer简介、下载、配置启动、发布shapefile全流程(图文实践)_霸道流氓气质的博客-CSDN博客_geoserver简介 geoserver版本为2.19.2&#xff0c;在windows10系统中正常启动并运行后&#…

教程篇 | 史上最简单也最全新手Revit教程

Hi&#xff0c;朋友们&#xff0c;我是建模助手。 近期发现&#xff0c;后台留言的画风日渐扭曲&#xff0c;很多用户的私信内容不仅跟有求必应无关&#xff0c;甚至跟建模助手也无关&#xff0c;而是关于Revit的问题。&#xff08;这就很离谱了&#xff09; 但后来小编也算是…

MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括

1、存储引擎 1.1、MySQL体系结构 连接层&#xff1a;最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证以及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a;第二层架构主要完成大多数的核心服务功…

Qt6 qtmqtt编译及演示示例(附带动态库)

前言 随着物联网的不断发展&#xff0c;如今很多项目都需要接入&#xff0c;而两年前也是因为项目需要&#xff0c;了解了一些关于mqtt的用法&#xff0c;并将其过程记录成几篇博客&#xff0c;近一年多时间陆陆续续有好多人私信咨询关于mqtt相关的问题&#xff0c;其中又有很…

ReentrantLock源码分析AQS原理

目录 (一)AQS简介 (二)AQS原理剖析 (三)源码思想-加锁&#xff1a; (1)构造方法 (2)公平锁lock方法(核心) 3、acquire获取资源方法(核心) (一)AQS简介 AQS是AbstractQueuedSynchronizer的简称,是一种实现阻塞锁和依赖FIFO队列的同步器框架。其依赖于一个原子变量state,子…

Unity Text Mesh Pro 浮动文字-学习

TextMeshPro&#xff08;TMP&#xff09;是unity的一套UI文字方案&#xff0c;支持对顶点、颜色进行编辑&#xff0c;自定义强&#xff0c;可扩展等优点。 对于英文数字即字符只需制作ASCII的文件即可&#xff0c;但是对于中文&#xff0c;如果我们的文字需要动态生成且不可控…

k8s教程(19)-pod之批处理调度

文章目录01 引言02 批处理调度2.1 任务模式分类2.1.1 按实现方式分类2.1.2 按批处理并行分类2.1 案例2.1.1 Job Template Expansion案例2.1.2 Queue with Pod Per Work Item案例2.1.3 Queue with Variable Pod Count案例03 文末01 引言 声明&#xff1a;本文为《Kubernetes权威…

思维方式之系统思维

这世界上的所有事物&#xff0c;都被规律作用着&#xff0c;以一种叫作“系统”的方式存在着。 我们身处时代这个大系统之中&#xff0c;如果没有一种全局的系统观&#xff0c;很容易就会和机遇失之交臂。凡事要顺势而为&#xff0c;用“个位”的管理对抗“千位”的时代&#…

精华推荐 |【Redis技术探索】「底层架构原理」深入透析主从架构的底层原理分析实现机制

&#x1f4d5;技术箴言 当心中有更高的山峰去攀登&#xff0c;就不会在意脚下的泥沼。 &#x1f4d5;前提概要 Redis高可用的方案包括&#xff1a;持久化、主从复制&#xff08;及读写分离&#xff09;、哨兵和集群&#xff08;Cluster&#xff09;。 &#x1f4d5;&#x1f…

音视频面试涨知识(四)

视频格式播放体验流量占用情况DASH统计直播推流端到播放端延时。支持和视频帧绑定的内容交互。比如&#xff0c;直播答题在播放端的弹窗等。小HLS对视频进行切片&#xff0c;按切片播放&#xff0c;缓存小起播快&#xff1b;拖动时间轴到任意时间播放时&#xff0c;可以快速定位…

dubbo2和dubbo3 入门简介

稳定版本:2.5.3 目前已恢复更新Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC通信、流量治理、可观测性等解决方案, 涵盖 Java、Golang 等多种语言 SDK 实现。3.0 版本的正式发布,标志着 Apache Dubbo 正式进入云原生时代。3.0 在通信协议、服务发现、部…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.1 初识OpenResty

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.1 初识OpenResty48.1.1 初识OpenResty48.1.2 安装OpenResty48 多级缓存 48.1 初识Open…