classSolution:defmaxSlidingWindow(self, nums: List[int], k:int)-> List[int]:# 暴力法时间复杂度O(Nk) 直接超出时间限制res =[]if k<1or k>len(nums):return res left =0right = k -1while right<len(nums):maxval = self.maxvalue(left,right,nums)res.append(maxval)left +=1right +=1return resdefmaxvalue(self,left,right,nums):maxval = nums[left]while left<=right:if maxval<nums[left]:maxval = nums[left]return maxval
解法二:单调队列法 解题思路:
如果队列最左侧索引已不在滑动窗口范围内,弹出队列最左侧索引
通过循环确保队列的最左侧索引所对应元素值最大
新元素入队
从第一个滑动窗口的末尾索引开始将最大值存储到结果res中
classSolution:defmaxSlidingWindow(self, nums: List[int], k:int)-> List[int]:# 边界条件if k *len(nums)==0:return[]# 优化if k ==1:return numsfrom collections import dequeq = deque()# 单调队列法:def clean_q()这个函数是精髓defclean_q(i):while q and q[0]<= i-k:q.popleft()while q and nums[q[-1]]< nums[i]:q.pop()q.append(i)res =[]for i inrange(k):clean_q(i)res.append(nums[q[0]])for i inrange(k,len(nums)):clean_q(i)res.append(nums[q[0]])return res