本文已参与「新人创作礼」活动,一起开启掘金创作之路。
规则如下:
- 将数加入队列时如果该数大于队列尾数,该尾数removeLast
- 如果当前队列头位置不在窗口内(遍历时数 i - k == getFirst())将头结点移除
- i > k-1之后的遍历,每次移动都有新窗口
通过上述三个操作,可以保持每个窗口最大值始终在队列头的位置。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
Deque<Integer> de = new LinkedList();
int[] arr = new int[nums.length - k + 1];
int x = 0;
if(nums == null || nums.length == 0) return new int[0];
for(int i = 0;i < nums.length;i++){
if(!de.isEmpty() && de.getFirst() == i - k){ //进入下一个窗口,当前的头需要丢掉
de.removeFirst();
}
while(!de.isEmpty() && nums[de.getLast()] < nums[i]){ //如果当前值大于尾,将尾丢掉
de.removeLast();
}
de.addLast(i); //加入当前值
//上述两个操作使得每次窗口最大的值在队列头
if(i >= k - 1) arr[x++] = nums[de.getFirst()];
}
return arr;
}
}