239. 滑动窗口最大值
题目
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
进阶:
你能在线性时间复杂度内解决此题吗?,这是本道题考察的重点
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
思路
使用单调队列可以解决,具体思路
参考:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/solution/java-dan-diao-shuang-xiang-lian-biao-hua-tu-xiang-/
代码
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
if(nums==null || n==0){
return new int[0];
}
int r[] = new int[n-k+1];
int index = 0;
//使用双向队列,因为它便于从两端进行插入和删除
ArrayDeque<Integer> A =new ArrayDeque<>();
for(int i=0;i<n;i++){
//while循环负责维护这个单调队列,这里单调队列是单调不增队列
while(!A.isEmpty() && nums[A.peekLast()]<nums[i]){
//把小于nums[i]的索引值,全部删除
A.pollLast();
}
//加入索引i
A.addLast(i);
//如果队列中的第一个元素满足if的条件,说明窗口滑过了这个元素,它应该被删去
if(A.peekFirst()== i-k){
A.pollFirst();
}
//当i不小于k之后,可以通过获得队列中的第一个元素来获得k窗口中的最大值
if(i>= k-1){
r[index++] = nums[A.peekFirst()];
}
}
return r;
}