1 class Solution: 2 def maxSlidingWindow(self, nums: 'List[int]', k: int) -> 'List[int]': 3 n = len(nums) 4 if n==0: 5 return [] 6 if k==0: 7 return [] 8 dic = {} 9 for i in range(k): 10 dic.update({i:nums[i]}) 11 12 maxindex = max(dic,key=dic.get) 13 result = list() 14 result.append(dic[maxindex]) 15 16 i=0 17 j=k 18 while j<len(nums): 19 del dic[i] 20 dic.update({j:nums[j]}) 21 maxindex = max(dic,key=dic.get) 22 result.append(dic[maxindex]) 23 i+=1 24 j+=1 25 26 return result
显然这是暴力搜索算法,性能比较差,执行时间1800ms,基本上是超时的边缘了。
下面是参考其他人的,执行时间120ms
1 class Solution: 2 def maxSlidingWindow(self, nums: 'List[int]', k: int) -> 'List[int]': 3 n=len(nums) 4 stack=[] 5 ans=[] 6 for i in range(n): 7 while stack and nums[i]>nums[stack[-1]]: 8 stack.pop() 9 while stack and i-stack[0]>=k: 10 stack.pop(0) 11 stack.append(i) 12 if i>=k-1: 13 ans.append(nums[stack[0]]) 14 return ans
思路分析:使用滑动窗口,stack是宽度为k的滑动窗口,并且里面的元素是从大到小排列的。
外层滑动窗口每次取的是stack[0],也就是当前滑动个窗口范围内最大的值的下标,存储在stack[0]中。因此nums[stack[0]]就是当前范围的最大值。