题目描述:
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
注:LeetCode[239]
示例:
详细代码:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
//用双端队列来存储数组的下标,为什么要存下标而不是存数值?
//因为存下标可以更方便的来确定元素是否需要移出滑动窗口
//判断下标是否合法来确定是否要移出
Deque<Integer> q = new LinkedList<>();
//搞不清res的size就举个例子来确定
int[] res = new int[nums.length - k + 1] ;
int index = 0;
for(int i = 0; i < nums.length; i++){
//保证队列的单调递减,使队列的出口始终为最大值
//注意队列存的是数组下标,所以判断逻辑是nums[i] > nums[q.peekLast()]
//容易误写成nums[i] > q.peekLast()
while(!q.isEmpty() && nums[i] > nums[q.peekLast()]){
q.pollLast();//检索并删除此列表的最后一个元素
}
q.offerLast(i);
//判断队列出口的值是否合法,如果值的下标不在窗口内则要将其移出
if(q.peekFirst() < i - k + 1){
q.pollFirst();
}
//窗口至少填满一次后才开始放最大值
//依然要注意队列存的是下标,所以赋值是赋nums[q.peekFirst()]
if(i >= k - 1){
res[index++] = nums[q.peekFirst()];
}
}
return res;
}
}
//leetcode submit region end(Prohibit modification and deletion)