2025-05-06 滑动窗口最大值
场景
在处理一些需要维护固定窗口大小的问题时,deque可以方便的实现窗口的滑动。尤其在处理滑动窗口内最大值最小值问题的时候,时间复杂度以及空间复杂度可以到O(n)
问题描述
给定一个数组 nums 和一个滑动窗口的大小 k,滑动窗口从数组的最左侧移动到最右侧,每次移动一个位置。要求找出每个滑动窗口内的最大值。
实现思路
使用双端队列维护一个单调递减的队列,队列中存储的是数组元素的索引,而不是具体的值,步骤如下:
1、初始化双端队列:创建一个空的双端队列deque用于存储索引
2、遍历数组:
1)当队列不为空且当前元素大于等于队列尾部元素对应的数组值时,不断从队尾移除元素,保证队列的单调性
2)将当前元素的索引添加到队尾
3)如果队列头部元素的索引超出了滑动窗口的范围,将其从队列头部移除
4)当遍历到k-1个元素之后,开始记录每个滑动窗口的最大值,即队列头部元素
代码
from collections import dequedef maxSlidingWindow(nums, k):result = []window = deque()n = len(nums)for i in range(n):# 当队列不为空,且当前元素的值大于队尾元素对应的数组值时,将队尾元素删除,保证队列的单调性while window and nums[i] >= nums[window[-1]]:window.pop()# 将当前元素的索引加入队尾window.append(i)# 如果队列头部元素的索引超出滑动窗口的范围,从队列中移除头部元素if window[0] <= i-k:window.popleft()# 遍历到k-1个元素之后,开始记录最大值if i >= k-1:result.append(nums[window[0]])return result