1. 题目
2. 思路
(1) 单调双端队列
- 根据题目要求,滑动窗口每右移一位,就会删除最左边的元素,而原来的最大值可能就是最左边的元素,因此,求滑动窗口内的最大值还需要知道滑动窗口内的次大值。
- 设置一个单调递减的双端队列,保证队头元素是滑动窗口内的最大值,其余元素是最大值右边的单调递减的元素。
- 每遍历一个元素,为了既能将其加入队列,又能保证队列单调递减的性质,就需要将队列中小于该元素的值全部从队尾删除,然后将该元素加入队尾。
- 若原来的最大值等于最左边的元素,则弹出队头元素,这样就能保证队列内的元素都是滑动窗口内的元素。
3. 代码
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0) {
return new int[0];
}
if (k == 1) {
return nums;
}
LinkedList<Integer> queue = new LinkedList<>();
for (int i = 0; i < k; i++) {
while (!queue.isEmpty() && queue.getLast() < nums[i]) {
queue.removeLast();
}
queue.addLast(nums[i]);
}
int[] res = new int[nums.length - k + 1];
res[0] = queue.getFirst();
for (int i = k; i < nums.length; i++) {
if (queue.getFirst() == nums[i - k]) {
queue.removeFirst();
}
while (!queue.isEmpty() && queue.getLast() < nums[i]) {
queue.removeLast();
}
queue.addLast(nums[i]);
res[i - k + 1] = queue.getFirst();
}
return res;
}
}