给定一个可能包含重复整数的数组和一个大小为k的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。
给出数组[1,2,7,7,8],滑动窗口大小为k=3,返回[7,7,8]。
使用双端队列(deque)来实现这个滑动窗口最大值的问题。具体的算法如下:
from collections import deque
def 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)。