📜  数据结构|队列|问题6(1)

📅  最后修改于: 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

以上代码实现了该问题的解决方案,并返回了滑动窗口在数组中移动时窗口内的最大元素集合。