千家信息网

LeetCode怎样找出滑动窗口的最大值

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,小编给大家分享一下LeetCode怎样找出滑动窗口的最大值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!题目描述:给定一个
千家信息网最后更新 2026年11月02日LeetCode怎样找出滑动窗口的最大值

小编给大家分享一下LeetCode怎样找出滑动窗口的最大值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

题目描述:

给定一个数组 nums 和滑动窗口的大小 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 -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

思路分析:

考虑到这道题的数组要求可以头部进去、删除,尾部进去,删除,所以使用双端队列Deque。使用双端队列的单调双端队列LinkedList实现。

所谓的单调,就是我们人为规定从队列的头部到尾部,所存储的元素是依次递减(或依次递增)的。

也就是说,我们维护一个单调的双向队列,窗口在每次滑动的时候,我就从队列头部取当前窗口中的最大值,每次窗口新进来一个元素的时候,我就将它与队列中的元素进行大小比较:

如果刚刚进来的元素比队列的尾部元素大,那么先将队列尾部的元素弹出,然后把刚刚进来的元素添到队列的尾部;
如果刚刚进来的元素比队列的尾部元素小,那么把刚刚进来的元素直接添到队列的尾部即可。

因此,通过这种既能从头部进出,又能从尾部进出的结构,来维持窗口的最大值的。

Python代码

# -*- coding:utf-8 -*-
class Solution:
def maxInWindows(self, num, size):
# write code here
# 存放可能是最大值的下标
maxqueue = []
# 存放窗口中最大值
maxlist = []
n = len(num)
# 参数检验
if n == 0 or size == 0 or size > n:
return maxlist
for i in range(n):
# 判断队首下标对应的元素是否已经滑出窗口
if len(maxqueue) > 0 and i - size >= maxqueue[0]:
maxqueue.pop(0)
while len(maxqueue) > 0 and num[i] > num[maxqueue[-1]]:
maxqueue.pop()
maxqueue.append(i)
if i >= size - 1:
maxlist.append(num[maxqueue[0]])
return maxlist

java代码:

class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
Deque deque=new LinkedList<>();
int len=nums.length;
if(len==0 ||k==0 ){
return new int[0] ;
}
int[] res=new int[len-k+1];

for(int i=0;i while(!deque.isEmpty() && nums[i]>deque.peekLast()){
deque.removeLast(); //比队列元素大就弹出队尾数据

}
deque.addLast(nums[i]);//不走循环直接加到队列末尾

}
res[0]=deque.peekFirst();
for(int i=k;i // 如果滑动窗口已经略过了队列中头部的元素,则将头部元素弹出
if(deque.peekFirst() == nums[i - k]){
deque.removeFirst();//
}
while(!deque.isEmpty() && deque.peekLast() < nums[i]){
deque.removeLast();
}
deque.addLast(nums[i]);
res[i - k + 1] = deque.peekFirst();


}
return res;
}
}

以上是"LeetCode怎样找出滑动窗口的最大值"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

队列 元素 最大 尾部 最大值 头部 单调 篇文章 下标 代码 内容 大小 数组 时候 不怎么 也就是 也就是说 位置 参数 双向 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华服互联网科技怎么样 互联网科技工作委员会副主任毛军 国智互联网科技 涨乐互联网科技 互联网科技的英文 天津摩尔互联网科技 互联网科技logo设计 互联网科技大会 互联网科技大会案例 互联网公司会议桌创意科技软装饰 银川新华互联网科技学校地址 互联网科技公司需要的职位 开一家科技互联网公司需要多少钱 互联网科技大奖都有哪些公司 电子科技大学互联网创业大赛 互联网科技圈年度人物 上海钢联属于互联网科技股吗 21世纪互联网科技成就 互联网对科技影响 科技发展第三阶段互联网时代 疫情对互联网科技公司影响 金诺互联网科技 互联网科技的 善班互联网科技有限公司 互联网科技教育视频 宝灵互联网科技有限公司 内蒙古九一互联网科技 企晟互联网信息科技有限公司 特约风豹互联网科技为什么扣费 版纳互联网科技选哪家
0