题目

image.png

解题思路

直接遍历,是O(n×k)的时间复杂度。数组长度为n,窗口大小为k。

能够实现O(N)的时间复杂度?

思考:如何在每次窗口滑动后,将“获取窗口内最大值”的时间复杂度从O(k)降低至O(1)。
参考题目:包含min函数的栈。

维护一个单调递减的队列,因为需要左边弹出(不在窗口范围),右边压入,使用双端队列来实现这个数据结构。
因为需要判断元素是否在窗口内,因此队列存储索引。

保证:deque中只要的第一个元素永远是当前窗口的最大值。

代码

  1. import collections
  2. class Solution:
  3. def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
  4. deque = collections.deque()
  5. res = []
  6. for i, num in enumerate(nums):
  7. while deque and deque[0] <= i - k: deque.popleft() # outdate indices
  8. while deque and num > nums[deque[-1]]: deque.pop()
  9. deque.append(i)
  10. if i >= k - 1:
  11. res.append(nums[deque[0]])
  12. return res