思路 1. 类似拿到栈中最小值时维持一个非严格递增辅助栈,这里也是维护一个单调队列(用的list) 滑块移动,对滑块最左边i,最右边j判值大小,因为每次滑块进来值索引是j+1, 出去值索引i-1; 然后保证当前滑块的最大值出现在单调队列的队首;所以每次进来新的值,都需要从队尾比较进(维持一个单调队列),因为如果只和队首最大比较,如果队首元素pop后,后续队列为空了;
class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: # 思路 # 1. 类似拿到栈中最小值时维持一个非严格递增辅助栈,这里也是维护一个单调队列(用的list) # 滑块移动,对滑块最左边i,最右边j判值大小,因为每次滑块进来值索引是j+1, 出去值索引i-1; # 然后保证当前滑块的最大值出现在单调队列的队首;所以每次进来新的值,都需要从队尾比较进(维持一个单调队列),因为如果只和队首最大比较,如果队首元素pop后,后续队列为空了; if not nums:return [] res, temp_list = [], [] n = len(nums) for i, j in zip(range(1-k, n-k+1), range(n)): # 找到滑块最左边i取值范围(1-k, n-k+1), 最右边j取值范围(0,n-1) if i > 0 and temp_list[0]==nums[i-1]: temp_list.pop(0) # 当滑块中最大值是在i-1位置,当移动滑块后,需要同时pop 队列中最大值的值 while temp_list and temp_list[-1] < nums[j]: temp_list.pop() # 如果移动滑块后,nums[j+1]值大于队尾元素,则元素一直出队 temp_list.append(nums[j]) if i >= 0: # 只有当滑块i>=0时,才开始取滑块最大值 res.append(temp_list[0]) return res