题目描述
给定一个数组编号,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口看到k个数字。每次滑动窗口右移一个位置。返回最大滑动窗口。
Example:
Input: nums = [1,3,-1,-3,5,3,6,7], and k = 3
Output: [3,3,5,5,6,7]
Explanation:
Window position Max
--------------- -----
[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
解决
可以使用双端队列
代码:
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 0 || k <= 0)
return new int[0];
int n = nums.length;
int[] result = new int[n-k+1];//数组用于存每次滑动窗口的最大值
Deque<Integer> deque = new ArrayDeque<>();//双端队列用于保存索引
int index = 0;
for(int i=0;i < n;i++){
//当窗口值为k值,移除最左端的值(队头)
if (!deque.isEmpty() && deque.peek() < i-k+1){
deque.poll();
}
//当新加入的值大于之前的值时,移除之前的值(向左比较)
while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]){
deque.pollLast();
}
//比较和移除完之后,将新索引存入队列中
deque.offer(i);
//从第k-1个元素开始,队头(最左端)索引对应的值此时是窗口中最大的值
if(i >= k-1){
result[index++] = nums[deque.peek()];
}
}
return result;
}