1. 问题描述
给定一个可能包含重复整数的数组和一个大小为k的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。
2. 问题示例
给出数组[1,2,7,7,8],滑动窗口大小为k=3,返回[7,7,8]。
3. 代码实现
使用双端队列(deque)来实现这个滑动窗口最大值的问题。具体的算法如下:
- 首先,创建一个双端队列 deque 和结果列表 result。
- 遍历数组,对于每个元素,执行以下操作:
- 在队尾添加当前元素索引 i,但在添加之前,需要先将队尾小于当前元素的元素全部弹出,以确保队列中的元素是递减的。
- 检查队首的元素是否已经超出窗口范围,如果是,则将其弹出。
- 当达到窗口大小时,将队首元素加入结果列表中,即为当前窗口的最大值。
- 返回结果列表。
from collections import dequedef maxSlidingWindow(nums, k):if not nums:return []result = []window = deque()for i in range(len(nums)):# 弹出队尾所有小于当前元素的值while window and nums[i] >= nums[window[-1]]:window.pop()# 将当前元素索引加入队尾window.append(i)# 检查队首元素是否超出窗口范围if window[0] <= i - k:window.popleft()# 达到窗口大小时,将队首元素加入结果列表if i >= k - 1:result.append(nums[window[0]])return result# 测试示例
nums = [1, 2, 7, 7, 8]
k = 3
print(maxSlidingWindow(nums, k)) # 输出 [7, 7, 8]
使用了双端队列 deque 来维护当前窗口内的最大值索引,算法的时间复杂度是 O(n)。