滑动窗口最大值
-
由于需要对队头和队尾操作,因此采用双端队列
-
队列中保存的是数组下标
-
当队列不空,且队头元素的下标不在窗口内,显然,需要将队头出队
-
然后需要每次维护队列保持单调递减,因为若队列中的元素比队尾中的小,他们永远也不可能成为当前队列中的最大值。
-
最后,遍历的元素数达到窗口大小时,只需每次保存队头元素下标所对应的元素值即为答案
class Solution {
public int[] maxInWindows(int[] nums, int k) {
int len = nums.length;
int[] res = new int[len - k + 1];
int c = 0;
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < len; i++) {
if (!deque.isEmpty() && deque.peekFirst() <= i - k)
deque.pollFirst();
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i])
deque.pollLast();
deque.offerLast(i);
if (i >= k - 1)
res[c++] = nums[deque.peekFirst()];
}
return res;
}
}