给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
- 滑动窗口使用的数据结构是双端队列
- deque中只包含窗口内的元素:每轮窗口滑动移除了元素 nums[i - 1],需将 deque 内的对应元素一起删除。
- deque 内的元素 非严格递减:每轮窗口滑动添加了元素 ,需将 deque 内所有 < nums[j + 1]的元素删除。
代码实现:
public class Solution {
public static int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length == 0 || k == 0) {
return new int[0];
}
//找出滑动窗口的最大值
//滑动窗口的个数是nums.length-k+1
int[] result = new int[nums.length - k + 1];
Deque<Integer> deque = new LinkedList<>();
for (int i =0,j=0;i < nums.length;i++){
// 弹出比当前num值小的元素
while(!deque.isEmpty() && nums[deque.peekLast()]<=nums[i]) {
deque.pollLast();
}
// 当队首元素坐标对应的num不在窗口中,需要弹出
if(!deque.isEmpty() && i-deque.peekFirst()+1>k) {
deque.pollFirst();
}
// 把每次滑动的num下标加入队列
deque.offerLast(i);
// 当滑动窗口首地址i大于等于size时才开始写入窗口最大值
if(i+1 >= k) {
result[j++] = nums[deque.peek()];
}
}
return result;
}
}