classSolution:defmaxSlidingWindow(self,nums: List[int],k:int) -> List[int]:iflen(nums)< k:returnNone res = []for i inrange(k, len(nums)+1): res.append(max(nums[i-k: i]))return res
时间复杂度:O(n × k)
空间复杂度:O()
单调队列 Monotonic Queue
classSolution:defmaxSlidingWindow(self,nums: List[int],k:int) -> List[int]: q = collections.deque()# 和单调栈一样,队列中保存的是indices res = []for i, cur inenumerate(nums):while q and nums[q[-1]]<= cur:# 因为迭代前面已有保证,这次把queue右边比自己小的没用了,可以pop出去 q.pop() q.append(i)# 特别之处在这里: 超过滑动滑口的部分pop出去, 在已有迭代基础上 每次pop一个即可if q[0]== i - k: q.popleft()# 如果窗口已经达到k的大小,记录最大值. 不够k的window不算if i >= k -1: res.append(nums[q[0]])return res
classMyQueue(object):def__init__(self): self.q = collections.deque()defpop(self,value):# 保证队列里是单调的,非空且等于出口时弹出# 这里是if 和 q[0],我自己写的while 和 q[-1], 这里多写大于等于更是问题了if self.q and value == self.q[0]: self.q.popleft()defpush(self,value):# 非空,push的值大于最小值时,一直弹出# 该value位置之前比他小的肯定是没用的了, 注意是>。等于的先留着?while self.q and value > self.q[-1]: self.q.pop() self.q.append(value)@propertydeffront(self): # 当前队列最大值, 第0return self.q[0]classSolution:defmaxSlidingWindow(self,nums: List[int],k:int) -> List[int]: q =MyQueue() res = []for i inrange(k): q.push(nums[i]) res.append(q.front)for i inrange(k, len(nums)): q.pop(nums[i - k])# 关键思路,所以单调队列的pop是带元素的 q.push(nums[i]) res.append(q.front)return res