难度:Hard
- 单调队列模板:滑动窗口最大值
- 直接用 Python 的 list 容器模拟链表,并通过 pop(0) 与 pop() 方法来实现弹出队头 / 队尾虽然能减小空间常数,但是由于 pop(0) 的时间复杂度是
的,所以理论上这样的时间复杂度会变成
,尽管仍然可以较高效地通过本题。所以自己还是手动地维护队头、队尾指针 head 与 tail
- 时间复杂度与空间复杂度均为
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
WindowMax = []
que = [0] * n
head = 0
tail = 0
for i in range(n):
if head < tail and que[head] < i + 1 - k:
head += 1
while head < tail and nums[que[tail-1]] <= nums[i]:
tail -= 1
que[tail] = i
tail += 1
if i + 1 >= k:
WindowMax.append(nums[que[head]])
return WindowMax