java数据结构与算法刷题-----LeetCode239. 滑动窗口最大值

LeetCode刷题经验分享:数据结构与算法核心 本文旨在为LeetCode刷题者提供系统化的知识框架与实战经验,覆盖数据结构(数组、链表、树、图等)和算法(排序、搜索、动态规划、贪心等)的核心内容。通过深度解析典型题目,阐述如何将理论知识转化为解题策略,重点提升代码实现能力与算法优化思维。本文采用“概念解析→算法原理→实战应用→工具资源”的逻辑结构,通过理论结合代码的方式,逐步拆解LeetCode高频题型的解题思路。核心章节包括数据结构底层原理、算法复杂度分析、典型题目代码实现、实战项目案例等,帮助读者建立从问题建模到代码优化的完整思维链路。数据结构。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

1. 法一:指针法

解题思路
  1. 我们以每一个窗口来看,找到每个窗口的最大值
  2. 那么找到最大值后,会面临一些情况。就是窗口滑动后,会从左边少一个元素,右边多一个元素
  3. 首先,如果右边多出来的,比当前最大值大的话,那它一定是新的最大值。因为上一次窗口中最大为max。而新加了一个右边的,比max大,那么右边这个就是最大的
  4. 如果右边的没有当前max大。那么就考虑左边,如果左边少了一个后,新的最左边结点和max一样,那么左边这个就是新最大值
  5. 如果刚好,上一次的max,在滑动窗口后,不在窗口范围了,那么没办法,只能遍历窗口元素,找到新的最大值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
代码:时间复杂度O(n),空间复杂度O(1)

在这里插入图片描述

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int left = 0;//滑动窗口左边界
        int right = k - 1;//滑动从窗口右边界
        int maxIndex = -1;//max元素下标
        int max = Integer.MIN_VALUE;//max - 1 = Integ.MAX_VALUE;

        int[] res = new int[nums.length - k + 1];//结果数组

        while (right < nums.length) {//还可以滑动就继续
            if (maxIndex > left) {//如果max在left右边
                if (nums[right] > max - 1) {//判断是否新添加元素>max
                    maxIndex = right;//如果right新元素>max就让max指向right
                    max = nums[maxIndex];
                }
            } else if (nums[right] > max - 1) {//如果max不在left右边,但是新添加元素,刚好>max
                maxIndex = right;//那么right一定新窗口是最大值,因为max是旧窗口的最大值
                max = nums[maxIndex];
            }else if (nums[left] >= max - 1 ) {//如果max不在left右边,而且right不是最大值,那么看看left是否是最大值
                maxIndex = left;//区域减少了一个值,添加一个right,right不是最大值,那就看看left是不是最大值
                max = nums[left];//是,就让max指向left
            }else {//上面条件都不成立,最大值既不是right也不是left,而是在中间的话。就只能循环找了
                maxIndex = left;
                max = nums[maxIndex];
                for (int i = left + 1; i <= right; i++) {
                    if (nums[i] > max - 1) {
                        maxIndex = i;
                        max = nums[maxIndex];
                    }
                }
            }
            res[left] = max;//每次都保存最大值
            left++;//滑动窗格
            right++;//滑动窗格
        }
        return res;
    }
}

2. 法二:单调队列

解题思路
  1. 每一个元素的下标都会从右端插入队列
  2. 如果插入时,队列前面的元素小于当前插入元素。说明它们不会是当前窗口最大值,我们将前面比它小的取出。然后插入当前元素
  3. 因为每次我们都将前面较小的去除了,所以最左边的元素永远是当前最大的。
  4. 但是最左边的这个下标,如果不是当前窗口范围内的下标,就先去除。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
代码:时间复杂度O(n),空间复杂度O(n)

在这里插入图片描述

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        Deque<Integer> deque = new LinkedList<Integer>();//单调队列保存下标 first <--|  队列  |--> last
        //处理第一个窗口
        for (int i = 0; i < k; ++i) {//将k个元素的下标放入单调队列
            //如果队列不为空,新元素比前面的元素大,就将前面比它小的元素取出
            while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
                deque.pollLast();//将前面小的取出
            }
            deque.offerLast(i);//将当前值的下标放入队列,保证它前面都是值比它大的下标
        }
        int[] ans = new int[n - k + 1];//答案数组,需要n-k+1个答案,也就是一共n-k+1个窗口
        ans[0] = nums[deque.peekFirst()];//将刚刚处理的第一个窗口结果放入ans[0]
        //处理剩下的窗口
        for (int i = k; i < n; ++i) {
            //如果队列不为空,新元素比前面的元素大,就将前面比它小的元素取出
            while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
                deque.pollLast();//将前面小的取出
            }
            deque.offerLast(i);//将当前值的下标放入队列,保证它前面都是值比它大的下标
            while (deque.peekFirst() <= i - k) {//如果左边界的下标已经不在当前窗口内
                deque.pollFirst();//将其出队列
            }
            ans[i - k + 1] = nums[deque.peekFirst()];//因为我们一直都只保留大的值,所以first就是当前窗口最大值
        }
        return ans;
    }
}
Coze平台智能体开发实战:打造测试工程师的AI助手 智能体是具备特定身份和能力的AI实体,由大语言模型(LLM)驱动,并通过插件、知识库和工作流扩展其能力。明确的角色定位:可以设定特定身份和专业领域扩展能力:通过插件连接外部工具和服务记忆能力:通过知识库存储和检索专属信息流程化处理:通过工作流执行复杂多步任务通过Coze平台创建测试工程师智能体,可以显著提升测试效率和质量。明确的角色定位:聚焦测试工程师的实际需求丰富的知识库:提供准确的领域知识支持合适的工具集成:通过插件连接现有工具链持续迭代优化:根据反馈不断改进智能体行为自动化测试生成。 阅读详情

相关推荐

WRF和WPS模型在Ubuntu系统上的安装与常见问题解决指南

本文详细介绍了在Ubuntu系统上安装WRF和WPS模型的完整教程,涵盖系统环境配置、依赖库安装、源代码编译以及常见问题的解决方案。重点解决了WPS编译中intmath.f文件的修改、环境变量设置和编译器兼容性等关键难点,帮助用户高效部署气象研究与预报模型。

weixin_29213525的博客 382

【LeetCode】剑指 Offer 59 - I. 滑动窗口的最大值(Java)

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 这道题和239. 滑动窗口最大值一样。 解法一 暴力破解 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if (nums.length == 0) return nums; int[] arr = new int[nums.length - k + 1]; int index =

小楊同学的笔记本 589

FDTD超表面仿真详细教程,几何相位,共振相位,传播相位

FDTD的超表面主要几何相位型(PB型)和共振型两种类型,其中PB型每个cell中的纳米棒的长宽相同,旋转角度不同,共振型长宽不同,旋转角度相同。本博文中以最常见的长方形纳米棒为例,用FDTD演示两种超表面实现的聚焦透镜的功能,包含详细步骤,其他形状,材料的超表面可自行尝试。

wuyuerhhg的博客 3万+

239.滑动窗口最大值(java)

题目描述 给定一个数组 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 3 6 7 3 1 [3 -1

m0_37605197的博客 358

jlink v9刷固件修改序列号来修复弹窗

jlink v9弹窗警告修复j

weixin_40500627的博客 9369

SDN:使用Postman控制ODL查看和下发流表

所谓,其实可被视作是SDN对网络设备的数据转发功能的一种抽象。在传统网络设备中,交换机和路由器的数据转发需要依赖设备中保存的二层MAC地址转发表或者三层的IP地址路由表,SDN交换机中使用的流表也是如此,不过在它的表项中整合了网络中各个层次的网络配置信息,从而在进行数据转发时可以使用更丰富的规则。其流表中的每个表项结果如下图所示:OpenFlow1.3流表的每个表项由6部分组成:1、匹配域:匹配域即OpenFlow1.0流表中的包头域,用于对交换机接收到的数据包的包头内容进行匹配。Ehter Des。

lyhaoyuhangyuan的博客 2535

leetcode239. 滑动窗口最大值(java详解)

一:题目 二:思路 1:lc通过版 class Solution { /* 思路:1.这里是要求出每一个窗口中的最大值,那么我们自然的想到如何用一个队列 可以使其每次队首 出现最大值,那么我自然回想到大顶堆,但是用了之后,我们窗口中的元素位置就发生了变化 那么当我们移动窗口的时候,就不能正确的 pop出窗口的首个元素。 2.那么这里的话,我们就自定义一个队列,当然的话,让其满足每次pop出去的最

qq_48508278的博客 1483

Xtract or Ucfyber的最条理的整理入门级教程

XTRACT可以对任意截面进行全过程截面分析。工程中常用来分析各种截面(如异形柱、组合截面等)的非线性特征点及承载力校核。 xtract主要思路也是根据各种材料本构关系,基于平截面假定,用fiber划分截面进行全过程非线性分析。......

→★佐佑思维★← 8402

滑动窗口最大值(java)

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

用来自己学习,复习 1181

MC_SetOverride指令详细应用介绍(基恩士PLC)

基恩士KV系列PLC和松下总线绝对值伺服运动控制(详细配置+轴控完整ST源代码)

RXXW_Dor的博客 336

深度学习助力台风路径预测:技术剖析与实战应用全攻略(基于LSTM模型)

摘要:深度学习技术在台风路径预测领域展现出巨大潜力。通过融合多源气象数据,深度学习模型如LSTM能有效处理时间序列数据,捕捉台风路径变化规律。与传统方法相比,深度学习模型在自动特征学习和处理复杂模式方面具有独特优势,提高了预测的准确性和实时性。然而,挑战依然存在,包括数据质量问题、模型可解释性不足以及极端台风的复杂性。未来,随着观测技术的进步和新算法的开发,深度学习将在台风路径预测中发挥更大作用,为防灾减灾提供更精准的决策支持。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2229

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

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

Cnc2014的博客 702

第6篇:ESP32连接无源喇叭播放音乐《涛声依旧》

相邻两个音之间的倍数是2^(1/12),约等于1.0594630943592952645618252949463)。这样一来,高八度的do频率是低八度do的两倍。我们把频率440赫兹作为中央C ,C调的歌就是把频率440赫兹当作do,乐谱中写作:1=C。一个八度分成12份,八个八度的十二平均音率对应的频率如下(从33Hz到7902Hz)。相邻的两个音之间的差一个半音,12345671之间的间隔分别是“全全半全全全半”。D调的歌就是把从440后面第二个音494赫兹当作do,乐谱中写作1=D。

Txwtech 1424

leetcode刷题总结之滑动窗口

前言: 这段时间课比较多,每天还要准备6级,所以题刷的有点慢。leetcode关于滑动窗口的题有20道,其中只有14道免费题,所以我就做了免费题啦。然后总结一下套路,以后复习用。 滑动窗口思想: 1) 2) 3) ...

algsup 6936

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java实现 LeetCode 239 滑动窗口最大值

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

南 墙 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LeetCode 239:滑动窗口最大值

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

m0_75126572的博客 911

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LeetCode239. 滑动窗口最大值

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

星辰大数据的博客 1045

leetcode 滑动窗口最大值(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现) leetcode题目 滑动窗口最大值 -- leetcode 239 题目描述 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。 返回滑动窗口最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6...

聚沙成塔 2942

数据结构与算法-算法-239. 滑动窗口最大值

【摘要】本文介绍了LeetCode 239题「滑动窗口最大值」的解法。该问题要求在一个整数数组中,找出所有长度为k的滑动窗口中的最大值。核心解法是使用双端队列维护一个单调递减的队列结构,队列头部始终存储当前窗口最大值的索引。通过两次循环处理:第一次移除超出窗口范围的索引,第二次移除小于当前元素的索引以保持队列单调性。当窗口首次完整时开始记录结果。该方法的时间复杂度为O(n),空间复杂度为O(k),能高效处理大规模数据。代码示例展示了具体的Java实现过程。

weixin_69759588的博客 909

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

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

ylumwd的博客 872

力扣刷题路线

结合高频题、经典题和算法思想学习建议,分阶段从基础到进阶编排,覆盖所有核心标签,并标注题号与学习方法。:画图模拟快慢指针移动,如移动零时快指针探路、慢指针标记非零位置。:括号生成时,左括号数不能超过n,右括号数不能超过左括号数。:LCA问题中,若左右子树均含目标节点,则当前节点为祖先。:终止条件、递归调用、返回值,如二叉树深度递归返回。:掌握虚拟头节点、递归反转、环形检测。:掌握索引操作、快慢指针、滑动窗口。:熟悉括号匹配、单调栈、层序遍历。:熟悉反转、哈希统计、回文处理。

FAQEW的博客 1819

代码随想录-Day13 | LeetCode239. 滑动窗口最大值、LeetCode347.前 K 个高频元素

栈模型可以想象成一个顶端开口的瓶子,其特性是先进后出,后进先出。从随想录中针对栈的题目,其实不难发现由于这个后进先出的特性,非常适合元素的匹配问题,比如说LeetCode20. 有效的括号:寻找我们左括号相同类型的右括号,我们直接从栈顶元素去对比;还有LeetCode1047. 删除字符串中的所有相邻重复项:我们在遍历字符串的时候,一旦发现当前所遍历的元素和栈顶元素重复,直接从栈顶pop进而达到删除重复项的目的。

weixin_45923460的博客 1005

【LeetCode 热题 100】239. 滑动窗口最大值——(解法三)滑动窗口+单调队列+数组

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

最短的捷径就是绕远路,绕远路才是我的最短捷径。 1482

【LeetCode 热题 100】239. 滑动窗口最大值——(解法一)滑动窗口+暴力解

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

最短的捷径就是绕远路,绕远路才是我的最短捷径。 1255

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] -3 5 3 6 7 3

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 2938
上一篇: java数据结构与算法刷题-----LeetCode150. 逆波兰表达式求值
下一篇: java数据结构与算法刷题-----LeetCode347. 前 K 个高频元素
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值