题目描述:
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}。
解题思路:
利用双端队列,双端队列用数组就可以实现,一个个放数据到temp,如果新放的数据大于之前放入的数据就把之前数据都删除,保证temp[0]中放入的数据是当前窗口最大值。
因为小的数据被删除,所以就需要考虑双端序列temp第一个元素到底应该什么时候弹出,根据规律,只有当新加数据的索引与temp中第一个元素的索引之差为size时才弹出temp中第一个元素。
应该什么时候输出最大值呢?因为滑动窗口当数据流已放入size个后,就有最大值,然后一步步滑动,所以只要数据流索引大于等于size就该输出了。
代码如下:
# -*- coding:utf-8 -*-
class Solution:
def maxInWindows(self, num, size):
# write code here
res,temp,i =[],[],0
if size == 0:
return res
while i < len(num):
if len(temp) > 0 and i - temp[0] == size:
temp.pop(0)
while len(temp) > 0 and num[i] > num[temp[-1]]:
temp.pop(-1)
temp.append(i)
if i >= size-1:
res.append(num[temp[0]])
i += 1
return res
时间复杂度为O(N)