LeetCode[239]滑动窗口最大值

news2024/11/23 7:10:12

难度:Hard

题目:

给你一个整数数组 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]

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
  • 1 <= k <= nums.length

Related Topics

  • 队列
  • 数组
  • 滑动窗口
  • 单调队列
  • 堆(优先队列)


重点!!!解题思路

 第一步:

明确解题思路:像这种滑动窗口的题一半都是维护一个单调队列来解答

第二步:

如果想要每次获得窗口的最大值,就相当于维护这个队列(这个队列相当于窗口),

让这个队列保持一个降序排序,那么队列的头部就是最大值,

当窗口移动时,队列可以尾部出队,头部也可以出队,那么这个队列就是一个双端队列 ,

知道这些即可做题了。

讲解+源码:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        ArrayList<Integer> res=new ArrayList<>();  //初始化结果集
        Deque<Integer> queue=new ArrayDeque<>();  //初始化双端队列
        for (int i=0;i<nums.length;i++){  //遍历数组
            while (!queue.isEmpty() && queue.peekFirst()<i-k+1) queue.pollFirst();  //如果当前队列的头部不在窗口的范围内,就让他poll掉
            while (!queue.isEmpty() && nums[queue.peekLast()]<nums[i]) queue.pollLast();  //如果当前遍历的值比尾部的值大,那么就让尾部出队,因为我们要降序的队列
            queue.add(i);  //每次添加的都是下标值
            if (i>=k-1){  //当窗口完全进入数组时才能算最大值
                res.add(nums[queue.peekFirst()]);
            }
        }
        return res.stream().mapToInt(Integer::valueOf).toArray();  //集合转换为数组的方式
    }
}

GPT解释:

 

 运行结果:

系列持续更新中,喜欢练习算法的那就点个攒吧    

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

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

相关文章

强化学习课程笔记一

强化学习基础概念及MDP算法&#xff0c;如图1所示 这张ppt上就展现了一节课全部的内容&#xff1a; Sets中有表示状态的S、有表示动作的A(s)、有表示奖励的R(s,a)&#xff0c;如图二所示 也介绍了概率分布&#xff08;Probability distribution&#xff09; 其中State transi…

2D组态:智慧生物质发电厂组态监控系统

进入21世纪以来&#xff0c;我国面临的能源安全和环境生态保护问题日趋严峻&#xff0c;可再生能源已经成为能源发展战略的重要组成部分以及能源转型的重要发展方向。根据可再生能源应用的不同领域&#xff0c;电力系统建设正在发生结构性转变&#xff0c;可再生能源发电已开始…

【技能实训】DMS数据挖掘项目-Day06

文章目录 任务6【任务6.5】编写物流数据分析类【任务6.6】创建物流数据分析测试类&#xff0c;测试任务6.5-6.6中的程序&#xff0c;演示物流信息的采集、分析及打印输出 任务6 【任务6.1】创建数据分析接口 在com.qst.dms.gather 下创建接口IDataAnalyse.java 【任务6.2】创…

【多线程进阶】多线程进阶学习(高并发、线程池、多线程使用场景)

文章目录 1、线程基础知识1.1、线程和进程线程和进程的区别&#xff1f; 1.2、并行与并发并行与并发有什么区别&#xff1f; 1.3、线程的创建方式创建线程的方式有哪些&#xff1f;刚才你说过&#xff0c;使用runnable和callable都可以创建线程&#xff0c;它们有什么区别呢&am…

MySQL数值

1.整数类型 TINYINT&#xff1a;非常小的整数&#xff0c;存储空间为1字节&#xff0c; 取值范围&#xff1a;有符号&#xff1a;-128---127&#xff0c;无符号&#xff1a;0---255 SMALLINT&#xff1a;小整数&#xff0c;存储空间为2字节 取值范围&#xff1a;有符号&#…

岩土工程振动在线监测:以道路桥梁基础为例

岩土工程振动在线监测&#xff1a;以道路桥梁基础为例 使用振弦传感器、采集仪和在线监测系统进行岩土工程监测&#xff1a;以道路桥梁基础振动监测为例 一个应用振弦传感器、振弦采集仪和在线监测系统构成的岩土工程监测案例是道路桥梁基础的振动监测。 在道路桥梁基础的振动…

力扣 455. 分发饼干

题目来源&#xff1a;https://leetcode.cn/problems/assign-cookies/description/ C题解1&#xff1a;将大饼干优先大胃口的孩子。 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.…

代码随想录二刷 day50 | 动态规划 之 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

day50 123.买卖股票的最佳时机III1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 188.买卖股票的最佳时机IV1.确定dp数组以及下标的含义2.确定递推公式4.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 123.买卖股票的最佳时机I…

java.lang.UnsatisfiedLinkError: no opencv_java410 in java.library.path

-Djava.library.pathhome/zwf/eclipse-workspace/DIPS_YTPC/lib/opencv-410/x64/

Element el-table 列表自定义样式

效果图 页面代码块 <el-tableref"multipleTable":data"tableData"tooltip-effect"dark"style"width: 100%"selection-change"handleSelectionChange"><el-table-columntype"selection"width"55&qu…

设计模式【行为型】-- 模板方法模式

模板方法模式&#xff08;Template method pattern&#xff09; 模板方法模式是一种行为型设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将一些步骤的具体实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下&#xff0c;重新定义算法中的某些步…

hydra详解(仅供学习参考)

一、概述。 Hydra是一款非常强大的渗透工具&#xff0c;由著名的黑客组织THC开发的一款开源工具。 二、使用方法。 hybra基础语法&#xff1a; hydra 参数 IP 服务 参数&#xff1a; -l login 小写&#xff0c;指定用户名进行破解 -L file 大写&#xff0c;指定用户的用户名…

uniapp uni实人认证

uni实人认证依赖 目前仅支持App平台。 h5端活体人脸检测&#xff0c;使用的是百度云的h5人脸实名认证 使用要求 1、app端 在使用前&#xff0c;请确保您已注册DCloud账号&#xff0c;并已完成实名认证。 然后需要按文档开通服务 业务开通 | uni-app官网 2、h5端 在使用前…

工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

FFmpeg、x264以及fdk-aac 编译整合

接上文 FFMPEG 编译流程(极客版) 编译 fdk-aac libfdk-aac version:0.1.5 下载 wget http://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.5.tar.gz#!/bin/bash NDK/home/maqi/Desktop/android-ndk-r20b # 这里需要替换成你本地的 NDK 路径&#x…

【来不及刷题之】43、最小栈(PriorityQueue)

因为要在常量时间内查询出最小值&#xff0c;所以需要有另外的数据结构维护最小值&#xff0c;很自然地想到了“堆”这个结构&#xff0c;“最小堆”的堆顶元素刚好是最小值因此出栈和入栈的同时也要维护好最小堆 class MinStack {PriorityQueue<Integer> heap;LinkedLi…

软件测试前途如何?要学吗?

1.前言 当我们面临择业问题的时候&#xff0c;因为我们本身对自己认知的不清晰和对现有自己能选择的岗位的不了解&#xff0c;往往不知道如何选择才是最优解。这个博客就专门来解答大家对于软件测试这个岗位的疑惑&#xff0c;让大家对软件测试这个岗位有更广义的了解。 本博…

观察者模式(下):如何实现一个异步非阻塞的EventBus框架?

上一节课中&#xff0c;我们学习了观察者模式的原理、实现、应用场景&#xff0c;重点介绍了不同应用场景下&#xff0c;几种不同的实现方式&#xff0c;包括&#xff1a;同步阻塞、异步非阻塞、进程内、进程间的实现方式。 同步阻塞是最经典的实现方式&#xff0c;主要是为了…

C++之std::is_same用法(一百五十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Flink HA方案介绍

1.Flink HA方案介绍 每个Flink集群只有单个JobManager&#xff0c;存在单点失败的情况。Flink有YARN、Standalone和Local三种模式&#xff0c;其中YARN和Standalone是集群模式&#xff0c;Local是指单机模式。但Flink对于YARN模式和Standalone模式提供HA机制&#xff0c;使集群…