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]]就是当前范围的最大值。

posted on 2019-03-05 22:09  Sempron2800+  阅读(174)  评论(0编辑  收藏  举报