文章目录
题目
滑动窗口的最大值
一、双指针
使用两个指针分别之乡滑动窗口的头部和尾部,求出最大值放入res后移动两个指针~
def max_value_1(arr, k):
if not arr or k <= 0 or k > len(arr):
return []
res = [0] * (len(arr) - k + 1)
res_index = 0
i, j = 0, k
while j <= len(arr):
res[res_index] = max(arr[i:j])
i += 1
j += 1
res_index += 1
return res
二、队列记录滑动窗口
比较直接的思路是一种设置两个指针,每次比较两个指针之间的数字,取max
这种在窗口较小的情况下,也比较高效。但是如果窗口很长,仍旧每次都要比较所有的数字,就十分不划算。
此时,我们借助一个队列,来存放当前窗口的数字。
例如:[2,-1,4,3,2,5,4], 窗口=3
1.初始化一个队列,放入第一个窗口的数字,并判断出第一个窗口的最大值,放入res
2.进入循环
a.队首元素出队(2出队)
b.新元素入队(3入队)
c.比较出队的元素2 是否是上一个滑动窗口的最大值
d.出队元素是上一个滑动窗口的最大值,比较队列(即当前滑动窗口)所有元素获取最大值;出队元素不是上一个窗口的最大值,比较上一个窗口的最大值与当前元素
e.放入res
def max_value(arr, k):
if not arr or k <= 0 or k > len(arr):
return []
res = arr[:len(arr)-k+1]
queue = arr[:k]
res[0] = max(queue)
res_index = 1
for i in range(k, len(arr)):
drop = queue.pop(0)
queue.append(arr[i])
if drop == res[res_index-1]:
res[res_index] = max(queue)
else:
res[res_index] = max(res[res_index-1], arr[i])
res_index += 1
return res