import sys
from typing import List
classSolution:defmaxSlidingWindow(self, nums: List[int], k:int)-> List[int]:
n =len(nums)# 如果数组为空 或是k=0if n * k ==0:return[]# 如果数组只有1个元素,直接返回该元素if n ==1:return[nums[0]]# 初始化队列和结果,队列存储数组的下标
queue =[]
res =[]for i inrange(n):# 如果当前队列最左侧存储的下标等于 i-k 的值,代表目前队列已满。# 但是新元素需要进来,所以列表最左侧的下标出队列if queue and queue[0]== i - k:
queue.pop(0)# 对于新进入到元素,如果队列前面的数比它小,那么前面的需要出队列while queue and nums[queue[-1]]< nums[i]:
queue.pop()
queue.append(i)# 新元素# 当前的大值加入到结果数组中if i >= k -1:
res.append(nums[queue[0]])return res
if __name__ =="__main__":
s = Solution()
nums =[1,3,-1,-3,5,3,6,7]
a = s.maxSlidingWindow(nums,3)print(a)
2.2 滑动窗口(推荐)
import collections
from typing import List
# 暴力法,超时classSolution:defmaxSlidingWindwo(self, nums: List[int], k:int)-> List[int]:
n =len(nums)if n * k ==0:return[]if n ==1:return[nums[0]]# 初始化队列和结果
q = collections.deque()
res =[]for i inrange(n):# 当前队列最左侧存储的下标等于i-k时,表示存满了if q and q[0]== i - k:
q.popleft()# 对于新加入的元素,如果队列前面的数字比它小,则前面的全部出列while q and nums[q[-1]]< nums[i]:
q.pop()# 新元素入列
q.append(i)# 开始计数if i >= k -1:
res.append(nums[q[0]])return res
2.3 暴力法(超时)
from typing import List
classSolution:defmaxSlidingWindow(self, nums: List[int], k:int)-> List[int]:
n =len(nums)if n * k ==0:return[]
out =[]for i inrange(n - k +1):
left = i
right = i + k
out.append(max(nums[left:right]))return out
if __name__ =="__main__":
s = Solution()
nums =[1,3,-1,-3,5,3,6,7]
a = s.maxSlidingWindow(nums,3)print(a)