一.题目:
给定一个数组.还有一个滑动窗口长度k,窗口从最左边滑到最右边.返回每一次窗口中的最大值.
Example:
Input: nums = [1,3,-1,-3,5,3,6,7], and k = 3
Output: [3,3,5,5,6,7]
Explanation:
Window position Max
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
二.解题思路:
这道题的关键是要维护一个单调递减栈,栈的长度不超过k.为了实现维护栈的长度,我们将数值及其下标都压入栈中.具体代码如下:
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
#队列中每个元素存的是(地址,值)
#que = [ (-1000000,1000000) ]
que = []
result = []
for i in range( len(nums) ) :
#为了满足滑动窗口长度要求
if len(que)>0 and i-que[0][0] >= k :
del que[0]
#为了满足滑动窗口单调递减要求
while len(que)>0 and que[-1][1]<=nums[i] :
que.pop();
que.append( (i,nums[i]) )
if i>=k-1 :
result.append(que[0][1])
return result