📅  最后修改于: 2023-12-03 15:10:20.297000             🧑  作者: Mango
给定一个数组和一个大小为$k$的滑动窗口,将滑动窗口从数组的最左边移动到最右边,每次滑动窗口时返回窗口内的元素.
给定数组$nums=[1,3,-1,-3,5,3,6,7]$ 和 $k = 3$, 滑动窗口的位置从左到右如下:
[1 3 -1] -3 5 3 6 7
1 [3 -1 -3] 5 3 6 7
1 3 [-1 -3 5] 3 6 7
1 3 -1 [-3 5 3] 6 7
1 3 -1 -3 [5 3 6] 7
1 3 -1 -3 5 [3 6 7]
则返回结果为:
[3,3,5,5,6,7]
此题可以使用队列来解决,每次滑动窗口相当于把元素从队列头移除,添加元素到队列尾部。如果队列头部的下标不在滑动窗口内,则将头部元素弹出,直至头部下标在滑动窗口内。队列中元素按照从大到小的顺序排列,每次扫描到一个新元素时,从队列尾部依次弹出比当前元素小的元素,在将新元素加入队列尾部。队列头部即为当前滑动窗口中的最大值。
from collections import deque
def maxSlidingWindow(nums: List[int], k: int) -> List[int]:
n = len(nums)
if n < k or k == 0:
return []
if k == 1:
return nums
res = []
q = deque()
for i in range(n):
# 弹出队列头部不在滑动窗口内的元素
while q and q[0] <= i - k:
q.popleft()
# 弹出队列尾部比当前元素小的所有元素
while q and nums[q[-1]] < nums[i]:
q.pop()
# 当前元素加入队列尾部
q.append(i)
# 队列头部为当前滑动窗口中最大值
if i >= k - 1:
res.append(nums[q[0]])
return res
以上代码实现了该问题的解决方案,并返回了滑动窗口在数组中移动时窗口内的最大元素集合。