题解 | #滑动窗口的最大值#
滑动窗口的最大值
https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param num int整型一维数组
# @param size int整型
# @return int整型一维数组
# 滑动窗口
class Solution:
def maxInWindows(self , num: List[int], size: int) -> List[int]:
# write code here
from collections import deque
if size == 0:
return [] # 特殊情况
res = [] # 存放结果
DQ = deque([]) # 队列存放窗口内的(索引, 数字)这个元组对,索引的作用是可以判断上次的最大值这一次还在不在窗口里
for i, i_num in enumerate(num): # 遍历
if not DQ: # 队列为空直接塞入
DQ.append((i, i_num))
else: # 队列不空,按照降序排列(保证队首的是该窗口内的最大元素),把小于当前值的元组对pop出去
if i_num < DQ[-1][1]: # 比队尾还小正常入队
DQ.append((i, i_num))
else: # 弹出队尾小数,压入当前数
while DQ and DQ[-1][1] < i_num:
DQ.pop()
DQ.append((i, i_num))
if i >= size-1: # 达到窗口数量
if i - DQ[0][0] >= size: # 判断上一次的最大值这次在不在窗口,不在就弹掉
DQ.popleft()
res.append(DQ[0][1]) # 存起来队首元素记为当前的窗口最大
return res