给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。
返回滑动窗口最大值。
示例:
输入: nums =[1,3,-1,-3,5,3,6,7]
, 和 k = 3 输出:[3,3,5,5,6,7] 解释:
滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
思路:使用双端队列,保持最大值一直在最左侧。代码参考leetcode一大佬。window里面是索引,i也是索引,res保存结果。
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
if not nums:return[]
res,window = [],[]
for i,x in enumerate(nums):
"""
1.判断元素是否超出滑动窗口范围
i > k 说明滑动窗口不为空,window[0] < i - k说明最大元素超出了窗口,这时候必须舍弃
队首元素:window.pop(0)
"""
if i >= k and window[0] < i - k:
window.pop(0)
"""
2.去除超出范围的元素后,这时候将当前x与滑动窗口内的队尾元素进行比较。
如果当前元素大于或者等于队尾元素,则将队尾元素舍弃掉window.pop(),直到窗口不再有比x更小的数为止。
注意判断window为空的情况
"""
while window and nums[window[-1]] <= x:
window.pop()
"""
3.把当前元素放到窗口中
"""
window.append(i)
"""
4.将这次滑动中的最大值放入到结果集中
注意是 大于等于,等于的时候,刚刚是窗口元素达到k个。这时候要计算最大值,否则会漏算。
"""
if i >= k - 1:
res.append(nums[window[0]])
return res