239. 滑动窗口最大值(单调队列)

  1. class Solution:
  2.     def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
  3.         deq=deque()
  4.         res=[]
  5.         for i in range(len(nums)):
  6.             while deq and deq[-1]<nums[i]:
  7.                 deq.pop()
  8.             deq.append(nums[i])
  9.             if i>=k and nums[i-k]==deq[0]:                       //注意是i-k(表示队列最左端元素),不是i
  10.                 deq.popleft()
  11.             if i>=k-1:
  12.                 res.append(deq[0])
  13.         return res

设计单调队列的时候,pop,和push操作要保持如下规则:

  1. pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
  2. push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止

转自评论区:

我悟了,队尾只要有更年轻(i越靠后)同时还能力更强(数值越大)的,留着其他比它更早入职同时能力却更差的没有什么意义,统统开了;队首的虽然能力最强,但是年龄最大,一旦发现它超过年龄范围(不在滑动窗口的范围内),不用看能力就可以直接开了。

发表评论