给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
例如
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
思路
这是一道滑动窗口的题目,具体类似单调栈,我们维持一个单调队列。具体的图解我参考了leetcode大佬的一篇 图解地址
public int[] maxSlidingWindow(int[] nums, int k) {
// 判断空
if(nums.length==0 || nums.length<k){
return new int[0];
}
int len = nums.length;
int[] res = new int[len-k+1];
LinkedList<Integer> dequeue = new LinkedList<>();
for(int i=1-k,j=0; j<len; j++,i++){
// 当滑出窗口的值 == 队列顶端的值,说明最大值要出去了
if(i>0 && dequeue.peekFirst()==nums[i-1]){
dequeue.removeFirst();
}
// 保证单调性,清除掉队列中比新进的小的数字
// 当然队列为空肯定不用清除
while(!dequeue.isEmpty() && dequeue.peekLast() < nums[j]){
dequeue.removeLast();
}
dequeue.addLast(nums[j]);
if(i >= 0) res[i] = dequeue.peekFirst();
}
return res;
}