题目1:滑动窗口的最大值
#方法1:暴力法+双指针
def maxInWindows(num, size):
if not num:
return None
if size==1:
return num
if size>len(num):
return max(num)
left=0
right=2
re=[]
while left<right:
re.append(max(num[left:right+1]))
left += 1
right += 1
if right==len(num):
break
return re
num=[2,3,4,2,6,2,5,1]
size=3
maxInWindows(num,size)
#方法2:滑动窗口
def maxInWindows(num, size):
#如果数组不存在,则返回[]
if not num:
return []
#如果滑动窗口的大小》数组的大小,或者size<0,则返回[]
if size> len(num) or size<1:
return []
if size==1:
return num
#存放可能是最大值的下标,和存放输出结果数组的初始化
maxdeque=[]
res=[]
n=len(num)
for i in range(n):
#判断队首下标对应的元素是否已经退出窗口
if i>=size and maxdeque[0]<=i-size:
maxdeque.pop(0)
#将第i个元素与maxdeque中的值比较,将小于i的值pop
while maxdeque and num[i]>num[maxdeque[-1]]:
maxdeque.pop()
#如果现在maxdeque长度没达到size规模,元素压入
maxdeque.append(i)
#每个完整的窗口保存当前最大值
if i>=size-1:
res.append(num[maxdeque[0]])
return res
num=[2,3,4,2,6,2,5,1]
size=3
maxInWindows(num,size)