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