题目描述
题解
单调队列
之前做过查找栈中最小值的题目, 做法是维护一个辅助的单调栈, 使其栈顶元素始终是主栈中的最小值.
本题的不同点在于主结构为滑动窗口, 那么对应的辅助机构为双端队列, 下面利用单调双端队列来完成题目要求.
每次滑动, 都要将右端元素加入窗口, 左端元素扔出窗口. 为了保持队列的单调性, 在将新的元素加入到队列中之前需要进行判断:
- 把队列中所有小于新加入窗口整数的元素删除, 确保新整数加进来之后队列依然是有序单调的
- 如果扔出窗口的元素正好是队列中的最大值, 那么需要将其删除
也就是说在窗口滑动后只有一种情况双端队列是不变的: 加入窗口的整数比队列中最后一个元素都小, 扔出窗口的元素也不是队列的队首元素
1 | public int[] maxSlidingWindow(int[] nums, int k) { |