Leetcode 239 滑动窗口最大值

Leetcode 239 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。 返回滑动窗口最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1] -3 5 ... 阅读详情

题目信息

LeetoCode地址: . - 力扣(LeetCode)

题目理解

题意是很好理解的,一个固定长度(k)的滑块从一个数组的左端一步一步向右滑,然后挑出滑块盖住的那些数字中最大的,组成的数组就是结果。

难点在于,当滑块移动时,左端的数字会被遗弃,如果遗弃的刚好是最大的数字,则要从剩下的k-1个元素以及右端新覆盖的元素里找到最大的。想要让时间复杂度低,需要找到一种低成本的方式维护这些数字的有序性。这样,即便最大的元素遗弃了,第二大的元素也唾手可得。

如何得到一个单调递减的元素列 array呢?假设当前滑块的左下标是l,右下标是r.

好,我们从下标i=l开始遍历,一开始元素列是空的,直接将i下标存进去。

array = [i]

i递增,来到i+1.此时有两种情况,

  1. i+1下标对应的元素比array最后一个元素小
  2. i+1下标对应的元素与array最后一个元素一样大
  3. i+1下标对应的元素比array最后一个元素大

对第一种和第二种情况,直接将其存入array,因为我们需要的就是单调递减的array。

对第三种情况,如果存入,则违反了单调递减,所以我们要从array尾部一直弹出元素,直到array为空,或者array尾部下标对应的元素比i+1对应的元素要更大。

这里可能有人会想不明白,如果将元素都弹出了,有没有可能找不到最大元素?其实不然,我们在找最大元素时,永远都是从array中取第一个元素,我们永远都会取到最大元素。

发现了嘛,我们是通过单调栈的方式使数组最终有序的,在这个过程中,我们遗弃了那些一定不会用到的元素。

当滑块向右移动时,原理是类似的,array中元素下标小于新l的元素需要从队首弹出,而新r对应的加入的元素需要遵循同样的方式从队尾插入array。

单调栈(单调队列)

在nums长度为l,滑块长度为k的情况下,

时间复杂度: O(l), 滑块至多移动l-k次,每次移动中,元素只会进出queue一次。

额外空间复杂度:O(k), 至多需要k长度的队列存储单调递减的数列。

public int[] maxSlidingWindow(int[] nums, int k) {
        // 题目理解中的array使用 一个双端队列实现
        LinkedList<Integer> queue = new LinkedList<>();
        int length = nums.length;
        int[] res = new int[length-k+1];
        // 对于头k个元素,需要初始化入队操作
        for (int i = 0; i < k; i++) {
            // 递归单调出栈,直到队空或者队尾大于当前元素
            while (!queue.isEmpty() && nums[queue.peekLast()] < nums[i]) {
                queue.pollLast();
            }
            // 插入新队尾元素
            queue.offerLast(i);
        }
        // 此时初始化完成的队列头元素就是第一个最大值
        res[0] = nums[queue.peekFirst()];
        // l 和 r 模拟滑块的左右两端
        int l = 1, r = l+k-1;
        //模拟滑块的移动操作
        while (r < length) {
            // 由于l持续右移,需要将array中队头小于l的元素移除
            while (!queue.isEmpty() && queue.peekFirst() < l) {
                queue.pollFirst();
            }
            // 重复单调出栈以及入栈的操作,保持队列单调递减
            while (!queue.isEmpty() && nums[queue.peekLast()] < nums[r]) {
                queue.pollLast();
            }
            queue.offerLast(r);
            res[l] = nums[queue.peekFirst()];
            l++;
            r++;
        }
        return res;
    }
Leetcode[239]滑动窗口最大值 python实现 Leetcode[239] python实现构造队列堆Leetcode (239) 滑动窗口最大值题目分析代码学习心得 构造队列 代码后续补上 堆 代码后续补上 Leetcode (239) 滑动窗口最大值 题目 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。 返回滑动窗口最大值。 分析 调用... 阅读详情

相关推荐

RDKit实战:5分钟搞定药物分子相似性分析(附Python代码)

本文提供了一套基于RDKit的快速药物分子相似性分析实战指南。通过Python代码演示,从环境搭建、分子指纹(如Morgan指纹)计算到Tanimoto相似性排序与可视化验证,帮助研究者在5分钟内完成从海量化合物库中精准筛选潜在活性分子的全流程,提升药物发现效率。

weixin_29193359的博客 312

力扣(LeetCode)100题:239.滑动窗口最大值

摘要:本文详细解析了LeetCode 239题「滑动窗口最大值」的两种解法。暴力解法采用双重循环遍历窗口元素求最大值,时间复杂度为O(nk)。优化解法包括:1)优先队列(最大堆),通过存储负值和索引实现,时间复杂度O(nlogn);2)单调队列(最优解),维护递减队列保证队首始终为当前窗口最大元素,时间复杂度O(n)。两种优化解法都通过详细注释和示例演示了算法流程,并分析了复杂度。其中单调队列解法空间复杂度O(k),是理论最优解。文章对比了不同解法的性能差异,并总结了关键实现技巧。

sweet_ran的博客 1074

uniapp 实现RFID识别的实战指南

本文提供了在uniapp中实现RFID识别的完整实战指南。核心在于通过Android系统广播机制,利用uni-app的plus对象调用原生接口,完成与RFID手持设备的“软硬件握手”。文章详细介绍了从环境准备、设备选型、核心代码实现到避坑优化的全流程,帮助开发者快速构建高效的RFID盘点或管理应用。

weixin_29161719的博客 404

【困难】力扣算法题解析LeetCode239:滑动窗口最大值

题目要求实现滑动窗口最大值,给定数组和窗口大小k,返回每个窗口的最大值序列。采用单调队列优化,核心思路是维护一个双端队列存储索引,确保队首始终为当前窗口最大值。遍历时移除过期元素并保持队列单调递减。Java代码通过双端队列动态维护窗口最大值,高效解决问题

ylumwd的博客 872

保姆级教程:用NVIDIA Jetson AGX Xavier和GMSL2相机搭建8路车载视觉原型系统

本文提供了一份详细的教程,指导如何使用NVIDIA Jetson AGX Xavier开发板和GMSL2相机搭建8路车载视觉原型系统。内容涵盖硬件选型、系统架构设计、软件环境配置、多路视频采集实现以及性能优化与问题排查,帮助开发者快速掌握GMSL2技术在车载视觉系统中的应用。

weixin_42525005的博客 294

【生产实践】PostgreSQL高可用Patroni安装(超详细已踩坑)

一 安装Patroni 0 Patroni 对Python的版本要求 我安装的是Patroni最新版本 :4.0.3,Patroni 对Python 版本有要求,没有具体的版本矩阵,但是根据每个版本发布信息可以得到以下信息 Patroni 4.0 需要 Python 3.8 以上(可以根据下面发布版本信息推理出) Version 3.0.2 Version 3.0.2 dropped support of Python older than 3.6. 版本3.0.2不再支持3.6版本以下的P

DBA之路的博客 1739

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

滑动窗口——窗口内的最大值

weixin_46879314的博客 1281

国科大学习资料--模式识别与机器学习(黄庆明)--期末复习题2(含答案)

国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) 国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) 国科大学习资料–模式识别与机器学习(黄庆明)–期末复习题2(含答案) ...

无名何许人的博客 1万+

力扣:239.滑动窗口最大值

力扣:239.滑动窗口最大值 题目链接 给你一个整数数组 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

meraki的博客 261

“华为杯”研究生数学建模竞赛2020年-【华为杯】D题:无人机集群协同对抗(附获奖论文和MATLAB代码实现)

1.问题重述摘 要:本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题,结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法,构建了无人机集群协同对抗推演模型。,构建了。我们综合考虑了,和。首先分析红方在集群约束下的贪婪队形和拦截策略,然后我们基于内点法联合MATLAB和AMPL编程求解蓝方突防的非线性规划解,最后基于蒙特卡洛法对整个蓝方突防过程进行推演,得到突防概率图。通过推演,我们提出了两块的区域作为所求区域,并对蓝方的最优突防策略进行分析。

getusushu的博客 1550

[内网基础] 内网基础知识 —— Windows 工作组

在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,如果不对这些计算机进行分组,网络的混乱程度是可想而知的。Windows 为了解决这一问题,就产生了工作组(Work Group)这个概念。Windows 工作组尝试将不通的计算机按功能(或部门)分别列入不同的工作组,例如技术部的计算机都列入 “技术部” 工作组、行政部的计算机都列入 “行政部” 工作组。要想访问某个部门的资源,只要在 “网络” 里双击该部门的工作组名,就可以看到该部门里的所有计算机了。

Blue17 の 小窝 1602

【算法入门】LeetCode 239. 滑动窗口最大值:Java与JavaScript双解法详解|单调队列的精妙运用力扣239题详解:滑动窗口最大值(Java & JavaScript 双语言实现)

通过本文,我们学习了如何使用Java和JavaScript解决滑动窗口最大值问题。使用双端队列来维护窗口中的最大值是一种有效的方法,它允许我们在O(n)的时间复杂度内完成整个数组的遍历。希望这篇文章能帮助你更好地理解并掌握这一知识点。好的,我很乐意为你提供详细的解答和博客内容。以下是一篇新手入门博客,包含Java和JavaScript的解答以及相关知识点的详细介绍。博客标题: 从零开始学习力扣题 239. 滑动窗口最大值目录:问题描述Java解答2.1 使用双端队列JavaScript解答。

南北极之间 1180

AI OS与LLM as OS:人工智能操作系统的崛起

近年来,随着大语言模型(Large Language Model, LLM)技术的突飞猛进,人工智能领域掀起了新的革命浪潮。以ChatGPT、GPT-4等为代表的LLM模型展现出了惊人的自然语言理解和生成能力,使得人机交互前所未有地拟人化、情境化。在此背景下,业界开始探索将LLM作为操作系统(Operating System, OS)的可能性,由此催生出"AI OS"和"LLM as OS"的概念。本文将深入解读这两个前沿概念,分析其内涵、技术原理、应用前景及面临的挑战。

AI天才研究院 993

力扣239题详解:滑动窗口最大值的多种解法与模拟面试问答

本文详细解读了力扣第239题“滑动窗口最大值”,通过使用双端队列高效地计算数组中每个滑动窗口的最大值,并提供了详细的解释和模拟面试问答。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

10年数据\经营分析经验,现任大厂数据分析负责人 2303

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LeetCode 239 滑动窗口最大值

LeetCode 239 滑动窗口最大值 题目链接 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1]

旺崽的博客 3081

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

239. 滑动窗口最大值 - 力扣(LeetCode)

假设输入数组为 nums = [1, 3, -1, -3, 5, 3, 6, 7],k = 3。移除 deque 中所有小于 5 的元素(3, -1, -3),deque 变为空。的滑动窗口从数组的最左侧移动到数组的最右侧。窗口形成,记录 7 → res = [3, 3, 5, 5, 6, 7]。输入:nums = [1,3,-1,-3,5,3,6,7], k = 3。窗口形成,记录 6 → res = [3, 3, 5, 5, 6]。最终结果 res 为 [3, 3, 5, 5, 6, 7]。

q1111111da的博客 751

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

leetcode 239.滑动窗口最大值(python)

leetcode 239.滑动窗口最大值(python) 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶: 你能在线性时间复杂度内解决此题吗? 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 ---------------

pureszgd的博客 1210

golang力扣leetcode 239.滑动窗口最大值

239.滑动窗口最大值239.滑动窗口最大值题解代码 239.滑动窗口最大值 239.滑动窗口最大值 题解 题目:给一个数组,再给一个k大小的滑动窗口,求窗口内的最大值 思路:优先队列 和 单调栈 1.维护一个单调递减队列 2.对于窗口右移,就是往队列中插入,与删除 3.而删除需要遍历,但是本题其实不急着删除,即延迟删除 4.也就是说当nums[i-k] == queue[0]的时候,就可以删除,这样就是O(1) 5.对于插入,需要维护递减,如果插入v大于下面的,则弹出下面的即可 例如:[5,6,1,2]3

清风 831

LeetCode 239:滑动窗口最大值

给定整数数组nums和窗口大小k,需返回。

m0_75126572的博客 911

LeetCode 239. 滑动窗口最大值

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

2301_80211119的博客 1388

leetcode:239. 滑动窗口最大值

题目解析 题目相当于维护了一个大小为3的滑动窗口,并输出每个滑动窗口内的最大值那么什么是滑动窗口呢?举个例子,我们从数组中第一个元素开始遍历,由于窗口的大小是333,因此当遍历到第三个元素时候窗口就形成了 之后,继续遍历元素,为了保持窗口的大小为3,左侧元素就需要从窗口中剔除。这样就使得窗口一直向右移动,直到考察到最后一个元素结束,这就是所谓的滑动窗口。怎么实现呢?我们分别维护两个变量L,R为表示一个窗口。那么,应该怎么滑动呢?令N = arr.size()维护一个滑动窗口并不难,但是我们需要解决一个问题:

OceanStar的博客 1303

LeetCode239. 滑动窗口最大值

LeetCode239. 滑动窗口最大值

Love Peace 525

代码随想录算法训练营第十一天|150. 逆波兰表达式求值 - 力扣(LeetCode),239. 滑动窗口最大值 - 力扣(LeetCode),347. 前 K 个高频元素 - 力扣(LeetCode

力扣算法

LXY999222的博客 877

[数组]Leetcode239滑动窗口最大值

Leetcode239 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int len=num

HollowKathrine的博客 165

Leetcode239.滑动窗口最大值——小总结

leetcode239

weixin_49023720的博客 326

LeetCode刷题第16天之《239滑动窗口最大值》

LeetCode239滑动窗口最大值 滑动窗口:这个概念应该是起源于计算网路的滑动窗口协议,是用来控制流量的。而在算法题中,滑动窗口的技巧常用在字符串和数组中得出子串或者子数组的一些极值的操作,关于滑动窗口更加形象的题目可以看leetCode上《和为s的连续正数序列》。 题目描述 定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶:你能在线性时间复杂度上解决此题吗?

weixin_44184990的博客 242
上一篇: Leetcode.901 股票价格跨度
下一篇: Leetcode 128 最长连续序列
耐利
博客等级 码龄12年 188粉丝 38原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值