描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
窗口大于数组长度的时候,返回空
示例1
输入:
[2,3,4,2,6,2,5,1],3
返回值:
[4,4,6,6,6,5]
设置一个单调递减的容器
- 遍历数组的每一个元素,
- 如果容器为空,则直接将当前元素加入到容器中。
- 如果容器不为空,则让当前元素和容器的最后一个元素比较,如果大于,则将容器的最后一个元素删除,然后继续讲当前元素和容器的最后一个元素比较(找到最大的)
- 如果当前元素小于容器的最后一个元素,则直接将当前元素加入到容器的末尾(备用选项)
- 如果容器头部的元素已经不属于当前窗口的边界,则应该将头部元素删除
class Solution:
def maxInWindows(self, num, size):
result = []
if len(num) < size or size == 0:
return result
#保存数组下标
tmp = []
#i为滑动窗口的右边界
for i in range(len(num)):
#需要把tmp中小于当前值的值都去掉,然后放进当前值
#第一个值为当前最大值(递减序列),后面的是为了当最大值滑出窗口时,有备用选择
while tmp and num[tmp[-1]] < num[i]:
tmp.pop(-1)
tmp.append(i)
#当最大值的下标距离目前窗口右边界i的位置超过size大小时,则说明当前窗口已经不包括该最大值,需要去掉
if tmp[0]+size <= i:
tmp.pop(0)
#滑动窗口开始,如size=5时,则从下标4开始,就有一个窗口
if i+1 >= size:
result.append(num[tmp[0]])
return result