classSolution:defmaxSlidingWindow(self, nums: List[int], k:int)-> List[int]:
res =[]for i inrange(len(nums)- k +1):
res.append(max(nums[i:i + k]))return res
单调队列 时间复杂度 O(N)
classSolution:defmaxSlidingWindow(self, nums: List[int], k:int)-> List[int]:
indexDq = collections.deque()# 首先填充第一个窗口的值for i inrange(k):# 单调递减队列 若当前值>=队尾的值 则弹出队尾的值while indexDq and nums[i]>= nums[indexDq[-1]]:
indexDq.pop()
indexDq.append(i)# 上面for循环过后 indexDq[0] 对应的值即为第一个窗口的最大值
resList =[nums[indexDq[0]]]# 开始滑动窗口 添加新元素 挤出老元素for i inrange(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 == kwhile indexDq[0]< i - k +1:
indexDq.popleft()# 此时 队列处于当前窗口之中 且对应的值单调递减# 则 当前窗口中的最大值就是 indexDq[0]对应的值
resList.append(nums[indexDq[0]])return resList