题目

解题思路
直接遍历,是O(n×k)的时间复杂度。数组长度为n,窗口大小为k。
能够实现O(N)的时间复杂度?
思考:如何在每次窗口滑动后,将“获取窗口内最大值”的时间复杂度从O(k)降低至O(1)。
参考题目:包含min函数的栈。
维护一个单调递减的队列,因为需要左边弹出(不在窗口范围),右边压入,使用双端队列来实现这个数据结构。
因为需要判断元素是否在窗口内,因此队列存储索引。
保证:deque中只要的第一个元素永远是当前窗口的最大值。
代码
import collectionsclass Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:deque = collections.deque()res = []for i, num in enumerate(nums):while deque and deque[0] <= i - k: deque.popleft() # outdate indiceswhile deque and num > nums[deque[-1]]: deque.pop()deque.append(i)if i >= k - 1:res.append(nums[deque[0]])return res
