239. 滑动窗口最大值
算法
-
维护一个单调递减队列:
- 使用一个双端队列
q
存储数组的索引 - 队列中的元素对应的值保持单调递减顺序,队首始终是当前窗口的最大值索引
- 使用一个双端队列
-
窗口滑动的处理:
- 窗口失效处理:检查队首索引是否超出当前窗口范围
(i - k + 1)
,若超出则弹出队首 - 保持单调性:将新元素加入队列时,弹出队列中所有小于当前元素值的索引,以确保队列的单调递减性
- 记录最大值:当窗口的大小达到
k
时(i >= k - 1)
,窗口的最大值即为队首索引对应的值
- 窗口失效处理:检查队首索引是否超出当前窗口范围
复杂度分析
时间复杂度
- 遍历数组:所有元素仅被插入和弹出队列一次,时间复杂度为
O(n)
- 队列操作:每次插入和弹出操作的平均时间复杂度为
O(1)
- 总时间复杂度:
O(n)
空间复杂度
- 使用了一个双端队列存储索引,空间复杂度为
O(k)
C++ 代码
|
|
Python 代码
|
|
Go 代码
|
|
JavaScript 代码
|
|