考察 单调队列
使用双端队列实现单调队列
思路是:
- 保持一个单调递减的队列(队头是最大值,队尾是最小值)
- 当头节点不在滑动窗口范围内时,把队头删掉
- 当尾结点的值小于当前要插入的值,把队尾删掉
- 把在滑动窗口内队头的
index
加入res
中
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
ArrayDeque<Integer> dq = new ArrayDeque<>();
int n = nums.length;
int idx = 0;
int[] res = new int[n - k + 1];
for (int i = 0; i < n; i++) {
while (!dq.isEmpty() && dq.peek() < i - k + 1) {
dq.poll();
}
while (!dq.isEmpty() && nums[dq.peekLast()] < nums[i]) {
dq.pollLast();
}
dq.offer(i);
if (i >= k - 1) {
res[idx++] = nums[dq.peek()];
}
}
return res;
}
}