LeetCode:滑动窗口最大值

news2024/11/26 15:36:56

文章收录于LeetCode专栏
LeetCode地址


滑动窗口最大值

题目

  给你一个整数数组 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 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

  示例 2:

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

双端队列

算法思路

  从题目可得,该题所指定的窗口是恒定的,同时只要进入窗口的元素比它前面的元素大,那么在它之前的元素就永远不再会成为最大值。所以根据以上两点分析可以使用一个双端队列,通过对双端队列的出队和入队操作来选择窗口中最大的元素值。所谓双端队列,其实就是队列的左右两端都可以进行入队和出队操作。
  以nums = [1,3,-1,-3,5,3,6,7],k = 3为例,具体思路如下:
  说明:双端队列维护的是元素对应的下标

  1. 初始窗口K长度的双端队列
    a. 队列为空,元素1直接从右端入队([1])
    b. 元素3大于队尾元素1,移除队尾元素1,然后元素3从右端入队([3])
    c. 元素-1小于队尾元素3,直接从右端入队([3,-1])
  2. 移动窗口维护双端队列
    a. 判断当前移动窗口的轮次是否已经超过双端队列左端的队首元素的下标
      i. 如果超过就需要先将双端队列左端的队首元素出队
       ii. 反之跳过此步骤
    b. 循环判断当前需入队的元素是否大于等于双端队列右端的队尾元素
       i. 如果大于等于,则移除双端队列右端的队尾元素,然后再循环判断
      ii. 反之跳过此步骤
    c. 将当前需入队的元素从双端队列的右端入队
    d. 将双端队列左端队首元素输出放入返回数组

  以上便是使用双端队列解答该题的详细思路,可结合以下动图理解
在这里插入图片描述

编码

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> deque = new ArrayDeque<>();
        int[] res = new int[nums.length - k + 1];
        for(int i=0; i<nums.length; i++){
            if(i >= k && deque.getFirst() <= i-k){
                // 如果双端队列头部元素的下标小于等于当前窗口首位元素的下标
                deque.removeFirst();
            }
            while(!deque.isEmpty() && nums[deque.getLast()] <= nums[i]){
                deque.removeLast();
            }
            deque.addLast(i);
            if(i >= k-1){
                res[i-k+1] = nums[deque.getFirst()];
            } 
        }
        return res;
    }
}

复杂度分析

  时间复杂度:O(n),其中 n 是数组 nums 的长度。每一个下标恰好被放入队列一次,并且最多被弹出队列一次,因此时间复杂度为 O(n)。
  空间复杂度:O(n),即为双端队列的长度大小,用于存储每次比较的数据。


一键三连,让我的信心像气球一样膨胀!

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

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

相关文章

编程语言QT、C++、C#、Matlab、SQL Server开发日志总结

目录 引言 正文 1、Qt连接SQL server数据库 2、C#使用chart绘制实时折线图&#xff0c;波形 3、ORACLEXE数据库 4、QT通过ODBC驱动连接Oracle数据库 5、Microsoft SQL Server 2014 安装图解 6、SQL Server 2014应用 7、C/C​​​​​​​ 8、QT…

【Fastadmin】后台角色组权限问题(multi,开关switch,控制器新增方法)

1.列表开关类型的权限 如图&#xff1a; 此类开关请求的方法为multi 开关在点击的时候默认是只允许修改数据库的status字段的&#xff0c;如果我们开关不是status字段&#xff0c;我们需要在服务端对应的控制器中定义protected $multiFields"id,name,swith";&#x…

使用FastGPT+OneAPI在本地使用Llama3

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01;他的重要特点就是工作流编排。 工作流编排&#xff1a;基于 Flow 模块的工作…

智慧之巅:大数据与算力中心的融合演进

智慧之巅&#xff1a;大数据与算力中心的融合演进 1 引言 在这个数据驱动的时代&#xff0c;我们站在了一个前所未有的历史节点上。大数据和算力中心&#xff0c;这两个曾经各自为政的领域&#xff0c;如今正以一种前所未有的方式交织在一起&#xff0c;共同推动着数字经济的蓬…

PY32MD310单片机介绍,非常适合做三相/单相 BLDC/PMSM主控

PY32MD310 单片机采用了高性能的 32 位 ARM Cortex-M0 内核&#xff0c;嵌入高达 64 Kbytes flash 和 8 Kbytes SRAM 存储器&#xff0c;最高工作频率 48 MHz。芯片内置多功能三相 PN 型半桥式栅极驱动器&#xff0c;片内集成多路 I2C、SPI、USART 等通讯外设&#xff0c;1 路 …

关于在Conda创建的虚拟环境中安装好OpenCV包后,在Pycharm中依然无法使用且import cv2时报错的问题

如果你也掉进这个坑里了&#xff0c;请记住opencv-python&#xff01;opencv-python&#xff01;&#xff01;opencv-python&#xff01;&#xff01;&#xff01; 不要贪图省事直接在Anaconda界面中自动勾选安装libopencv/opencv/py-opencv包&#xff0c;或者在Pycharm中的解…

Qt :信号与槽

信号与槽 信号介绍connect 函数使用connect 函数传参问题 定义槽&#xff08;solt&#xff09;函数方法一方法二 定义信号关键字 signals、emit 定义带参数的信号和槽参数个数不一致问题断开信号和槽的连接 disconnect lambda 表达式 信号介绍 Qt 中&#xff0c;信号会涉及三个…

上海个人购房提取公积金经历和注意事项(收藏不踩坑)

在前一篇文章中&#xff0c;我介绍了 2024 年 4 月 24 日上海个人购房个税退税经历&#xff0c;我于 4 月 27 日周六&#xff0c;顺利办理租房公积金提取业务&#xff0c;资金在业务办理完成后 10 分钟左右到账。通过本文分享办理过程的材料和注意事项&#xff0c;避免大家踩坑…

windows平台安装labelme

之前写过一篇文章也是关于在windows平台安装labelme的&#xff1a;《windows平台python版labelme安装与使用_labelme下载-CSDN博客》&#xff0c;随着软件与工具的更新换代&#xff0c;按照同样的方法最近在使用的时候出现了错误&#xff0c;出现创建虚拟环境失败&#xff0c;具…

专项技能训练五《云计算网络技术与应用》实训8-1:建立基于OpenvSwitch的GRE隧道

文章目录 建立基于OpenvSwitch的GRE隧道1. 使用VMware安装2个CentOS 7虚拟机&#xff0c;安装时记得都开启CPU虚拟化&#xff0c;第一台命名为“Docker”&#xff0c;第二台命名为“KVM”。2. 安装完虚拟机后&#xff0c;进入虚拟机&#xff0c;修改网络配置&#xff08;onboot…

stable-diffusion-webui配置

源码地址 https://github.com/AUTOMATIC1111/stable-diffusion-webui.git报错Fresh install fail to load AttributeError: NoneType object has no attribute _id pydantic降级 pip uninstall pydantic pip install pydantic1.10.11记得要把clip-vit-large-patch14放在opena…

SSM+Vue+Element-UI实现教资考前指导系统

前言介绍 对于本教资考前指导系统的设计来说&#xff0c;系统开发主要是采用java语言技术&#xff0c;在整个系统的设计中应用MySQL数据库来完成数据存储&#xff0c;具体根据教资考前指导系统的现状来进行开发的&#xff0c;具体根据现实的需求来实现四六级在线考试系统网络化…

展开说说:Android线程池解析

何谓线程池&#xff1f;本人理解是存放和管理线程的一个容器。 线程池存在的意义是什么&#xff1f; 第一&#xff1a;前面博客提到过创建和销毁线程的操作本身是有性能开销的&#xff0c;如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本&a…

Windows安装Cygwin

背景介绍 在Windows上安装Python包时&#xff0c;就算启用了指定的虚拟环境&#xff0c;安装都会被安装到系统的Python环境中,为了避免污染系统Python环境&#xff0c;所以决定在Windows上安装Cygwin使用Linux相关命令创建Python虚拟环境。 安装Cygwin 下载Cygwin安装包 我…

618挑选家用洗地机,需要注意哪些事项?有哪些家用洗地机值得买?

近年来&#xff0c;智能清洁家电越来越受到消费者的欢迎&#xff0c;洗地机作为清洁家电的新宠&#xff0c;凭借其集扫地、拖地、杀菌清洗于一体的强大功能&#xff0c;成为市场上的热销产品。那么&#xff0c;这类洗地机真的好用吗&#xff1f;怎么挑选到好用的家用的洗地机呢…

【DeepLearning.AI】吴恩达系列课程——使用ChatGPT API构建系统(持续更新中——)

目录 前言一、Language Models, the Chat Format and Tokens&#xff08;LLM&#xff0c;交互形式&#xff09;1-1、加载api-key1-2、使用辅助函数&#xff08;即指令调整LLM&#xff09;1-2、使用辅助函数&#xff08;聊天格式&#xff09;1-3、辅助函数修改&#xff08;输出字…

Spring - 6 ( 9000 字 Spring 入门级教程 )

一&#xff1a; SpringBoot 配置文件 1.1 配置文件作用 配置文件通常是一个文本文件&#xff0c;其中包含了程序或系统的各种设置、选项和参数。比如C:\Users, C:\Windows 文件夹, 以及各种 .config, .xml 文件 配置文件主要是为了解决硬编码&#xff08;代码写死&#xff0…

数据分析必备:一步步教你如何用numpy改变数据处理(6)

介绍&#xff1a; NumPy 广播&#xff08;Broadcasting&#xff09;是指当两个形状不同的数组进行运算时&#xff0c;NumPy 有能力灵活地改变其中某个&#xff08;些&#xff09;数组的形状从而使得运算可以正常进行。 广播的规则主要包括以下几点&#xff1a; 当一个数组是一个…

C语言----汉诺塔问题

1.什么是汉诺塔问题 简单来说&#xff0c;就是有三个柱子&#xff0c;分别为A柱&#xff0c;B柱&#xff0c;C柱。其中A柱从上往下存放着从小到大的圆盘&#xff0c;我们需要借助B柱和C柱&#xff0c;将A柱上的所有圆盘转移到C柱上&#xff0c;并且一次只能移动一个圆盘&#…

【区块链】智能合约简介

智能合约起源 智能合约这个术语至少可以追溯到1995年&#xff0c;是由多产的跨领域法律学者尼克萨博&#xff08;NickSzabo&#xff09;提出来的。他在发表在自己的网站的几篇文章中提到了智能合约的理念。他的定义如下&#xff1a;“一个智能合约是一套以数字形式定义的承诺&a…