链接: https://leetcode-cn.com/problems/sliding-window-maximum/
题意
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位
解法
由于需要求出滑动窗口的最大值,假设当前的滑动窗口中有下标$i$和$j$且满足$ i \leq j $,且前者小于后者
当窗口向右滑动时,只要$ i $还在窗口中,则$ j $一定也在窗口中,且$ nums[i] $一定不会是窗口的最大值
因此可以把$ nums[i] $永久移除
考虑单调队列,队列中的元素按由大到小递减进行维护,每次队列头则是当前窗口的maxValue
每次添加新元素的时候把队列尾部比当前元素小的元素进行pop,始终保持队列有序
实现的时候有两种写法,一种是队列中保存数组值,另一种是存下标
实现起来差不多,存数组值的时候注意要严格小于才进行pop,否则会出错。
存下标的话就不用担心数组元素重复的问题,给出的代码是存值的写法。
另外,还可以使用分块来做,这边也提供一份代码。
代码
单调队列
1 | class Solution { |
分块
1 | class Solution { |