jz59_1.滑动窗口的最大值

题目描述

题解

单调队列

之前做过查找栈中最小值的题目, 做法是维护一个辅助的单调栈, 使其栈顶元素始终是主栈中的最小值.

本题的不同点在于主结构为滑动窗口, 那么对应的辅助机构为双端队列, 下面利用单调双端队列来完成题目要求.

每次滑动, 都要将右端元素加入窗口, 左端元素扔出窗口. 为了保持队列的单调性, 在将新的元素加入到队列中之前需要进行判断:

  • 把队列中所有小于新加入窗口整数的元素删除, 确保新整数加进来之后队列依然是有序单调的
  • 如果扔出窗口的元素正好是队列中的最大值, 那么需要将其删除

也就是说在窗口滑动后只有一种情况双端队列是不变的: 加入窗口的整数比队列中最后一个元素都小, 扔出窗口的元素也不是队列的队首元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length==0||k==0){
return new int[0];
}
int[] res = new int[nums.length - k + 1];
Deque<Integer> deque = new LinkedList<>();
for (int j = 0, i = 1 - k; j < nums.length; i++, j++) {
if (i > 0 && deque.peekFirst() == nums[i - 1]) {
deque.removeFirst();
}
while (!deque.isEmpty() && deque.peekLast() < nums[j]) {
deque.removeLast();
}
deque.add(nums[j]);
if (i >= 0) {
res[i] = deque.peekFirst();
}
}
return res;
}
-------------本文结束感谢您的阅读-------------
可以请我喝杯奶茶吗