题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
Solution
用一个双端队列,队列第一个位置保存当前窗口的最大值,当窗口滑动一次
- 判断当前最大值是否过期
- 新增加的值从队尾开始比较,把所有比他小的值丢掉
class Solution:
def maxSlidingWindow(self, num: List[int], k: int) -> List[int]:
if k <= 0: return []
Q, ans = [], []
for i in range(len(num)):
if Q and i - Q[0] == k: # 最大元素index超过了窗口范围,过期
Q.pop(0)
# 弹出比当前元素小的队列元素的索引
while Q and num[i] > num[Q[-1]]:
Q.pop()
Q.append(i)
if i >= k-1:
# 列表循环前k-1次不满足一个窗口不计入答案
ans.append(num[Q[0]])
return ans