解题思路:可以使用双端队列来维护滑动窗口内的最大值,遍历数组,并在每个元素处维护一个单调递减的双端队列,用于存储当前滑动窗口内的最大值可能的索引。在遍历过程中,首先将不在当前滑动窗口范围内的索引移除队列。然后,将队列中小于当前元素的索引移除,以保持队列中元素的单调递减性质。将当前元素的索引加入队列。如果当前索引已经形成一个完整的窗口,即已经大于等于 k - 1,则记录当前窗口的最大值,即队列头部元素对应的值。最后返回记录下来的滑动窗口最大值数组。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0 || k <= 0) return new int[0];
int n = nums.length;
int[] result = new int[n - k + 1];
int index = 0;
// 双端队列用于存储数组索引,保证队列中索引对应的元素满足单调递减的顺序
Deque<Integer> deque = new ArrayDeque<>();
// 遍历数组
for (int i = 0; i < n; i++) {
// 首先移除不在滑动窗口范围内的索引
while (!deque.isEmpty() && deque.peek() < i - k + 1) {
deque.poll();
}
// 移除队列中小于当前元素的索引,保证队列中元素满足单调递减的顺序
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.pollLast();
}
// 将当前索引加入队列
deque.offer(i);
// 如果窗口已经形成,则记录当前窗口的最大值
if (i >= k - 1) {
result[index++] = nums[deque.peek()];
}
}
return result;
}
}