题目:
题解:
滑动窗口可以用双指针来实现,本题难点在于如何维护窗口内的最大值,可以使用单调队列,队列中维护当前窗口部分最大值并且单调递减,窗口移动时需要从新计算,时间复杂度:O(n)。
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
Deque<Integer> deque = new LinkedList<>();
int[] resultArray = new int[n-k+1];
for(int i = 0; i < k; i++) {
while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
deque.pollLast();
}
deque.offerLast(i);
}
resultArray[0] = nums[deque.peekFirst()];
for(int i = k; i < n; i++) {
while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
deque.pollLast();
}
deque.offerLast(i);
// 移除不在窗口内的元素
while (!deque.isEmpty() && deque.peekFirst() <= i-k) {
deque.pollFirst();
}
resultArray[i-k+1] = nums[deque.peekFirst()];
}
return resultArray;
}