📅  最后修改于: 2023-12-03 15:26:09.152000             🧑  作者: Mango
队列是一种先进先出(First-In-First-Out,FIFO)的数据结构,支持在队尾插入元素,在队首删除元素,并且可以查看队首元素。
问题 11 是说给定一个数组和一个窗口的大小,求每个窗口内的最大值。这个问题可以通过队列来解决。
def max_in_sliding_window(nums, k):
if not nums or k < 1: # 特判
return []
deque = [] # 存储元素下标的双端队列
# 初始化双端队列
for i in range(k):
while deque and nums[deque[-1]] < nums[i]:
deque.pop()
deque.append(i)
res = []
for i in range(k, len(nums)):
res.append(nums[deque[0]])
# 判断队首元素是否过期
if deque and deque[0] < i - k + 1:
deque.pop(0)
# 插入当前元素的下标到队尾
while deque and nums[deque[-1]] < nums[i]:
deque.pop()
deque.append(i)
res.append(nums[deque[0]]) # 最后一个窗口
return res
时间复杂度:O(n),由于每个元素最多进出队列一次。
空间复杂度:O(k),双端队列的最大长度为窗口大小,即 O(k)。