思路
1.维护一个双端队列。
2.当窗口未形成时,向双端队列加入元素。每一次加入时查看队列中比插入元素小的元素,如果小则从尾部出队列。当刚好到达窗口值时,第一个滑动窗口最大值就是队列首元素。
3.当窗口形成时,在添加元素之前要查看队列首元素是否等于要离开滑动窗口的值,如果是,就删除。(还有在加入时也要将小于待插入元素的值出队列),这样队列首元素总数滑动窗口的最大值加入res数组即可。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 0 || k == 0) return new int[0];
Deque<Integer> deque = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
//未到达窗口值
for(int i = 0; i < k; i++){
while(!deque.isEmpty() && deque.peekLast() < nums[i]){
deque.removeLast();
}
deque.addLast(nums[i]);
}
//第一个窗口
res[0] = deque.peekFirst();
//达到之后
for(int i = k; i < nums.length; i++){
if(deque.peekFirst() == nums[i - k])
deque.removeFirst();
while(!deque.isEmpty() && deque.peekLast() < nums[i])
deque.removeLast();
deque.addLast(nums[i]);
res[i - k + 1] = deque.peekFirst();
}
return res;
}
}