- class Solution:
- def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
- deq=deque()
- res=[]
- for i in range(len(nums)):
- while deq and deq[-1]<nums[i]:
- deq.pop()
- deq.append(nums[i])
- if i>=k and nums[i-k]==deq[0]: //注意是i-k(表示队列最左端元素),不是i
- deq.popleft()
- if i>=k-1:
- res.append(deq[0])
- return res
设计单调队列的时候,pop,和push操作要保持如下规则:
- pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
- push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止
转自评论区:
我悟了,队尾只要有更年轻(i越靠后)同时还能力更强(数值越大)的,留着其他比它更早入职同时能力却更差的没有什么意义,统统开了;队首的虽然能力最强,但是年龄最大,一旦发现它超过年龄范围(不在滑动窗口的范围内),不用看能力就可以直接开了。