剑指Offer【滑动窗口的最大值】
题目描述
给定一个数组 nums
和滑动窗口的大小 k
,请找出所有滑动窗口里的最大值。
示例:
1 |
|
提示:
你可以假设 k 总是有效的,在输入数组 不为空 的情况下,1 ≤ k ≤ nums.length
。
解法
单调队列
本题的难点在于如何以时间复杂度O(1)的情况下获取单次滑动窗口的最大值
假设窗口的左指针为
i
,右指针为j
每次窗口移动时会去掉
nums[i-1]
,增加nums[j+1]
我们保证队列内的元素都为窗口内的元素,且单调递减
- 针对减少的
nums[i-1]
,最大值出现在窗口左侧时,我们从队列中去除此元素,因为后续的窗口中不会出现该数 - 针对新增的
nums[j+1]
,为了保证队列递减,需要对队列内小于新增元素的值进行删除
- 针对减少的
之后取队首元素即可
1 |
|
- 时间复杂度:O(n)
来源:力扣(LeetCode)
链接:剑指 Offer 59 - I. 滑动窗口的最大值 - 力扣(LeetCode)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 漫漫长夜!