LeetCode链接
暴力法 时间复杂度 O(N*K)class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
res = []
for i in range(len(nums) - k + 1):
res.append(max(nums[i:i + k]))
return res
单调队列 时间复杂度 O(N)
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
indexDq = collections.deque()
# 首先填充第一个窗口的值
for i in range(k):
# 单调递减队列 若当前值>=队尾的值 则弹出队尾的值
while indexDq and nums[i] >= nums[indexDq[-1]]:
indexDq.pop()
indexDq.append(i)
# 上面for循环过后 indexDq[0] 对应的值即为第一个窗口的最大值
resList = [nums[indexDq[0]]]
# 开始滑动窗口 添加新元素 挤出老元素
for i in range(k, len(nums)):
# 每新来一个值 则从队列末尾将<=新值的 全部弹出
while indexDq and nums[i] >= nums[indexDq[-1]]:
indexDq.pop()
# 将新值索引加入 队列值单调递减
indexDq.append(i)
# 查看队头 即当前的最左边界 是否在当前的窗口中
# 当前的窗口范围应为 [i - k + 1, i] 因为 i - (i - k + 1) + 1 == k
while indexDq[0] < i - k + 1:
indexDq.popleft()
# 此时 队列处于当前窗口之中 且对应的值单调递减
# 则 当前窗口中的最大值就是 indexDq[0]对应的值
resList.append(nums[indexDq[0]])
return resList



