1 题目描述
2 算法思路
思路:
- 使用一个单调栈来装最大值,每次窗口移动,都进行更新,栈首存放最大值
- 在往窗口添加元素后
- 先判断,当前窗口移出的元素是不是栈首的元素,如果是,就移出栈首,如果不是,就不管
- 然后将当前元素num[j] 从栈底添加,弹出所有比nums[j] 小的元素
- 此时栈顶就是最大值,更新res
3 代码
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
Deque<Integer> deque = new LinkedList<>();
if(nums.length == 0 || k == 0)
return new int[0];
int[] res = new int[nums.length - k + 1];
for(int i = 0; i < k; i++){ //为形成窗口
while(!deque.isEmpty() && deque.peekLast() < nums[i]) //如果小于新元素,就弹出单调栈中所有元素
deque.removeLast();
deque.addLast(nums[i]);
}
res[0] = deque.peekFirst();
for(int i = k; i < nums.length; i++){
if(deque.peekFirst() == nums[i - k]) //如果左边界的元素,就是当前栈中最大的元素
deque.removeFirst();
while(!deque.isEmpty() && deque.peekLast() < nums[i]) //删除栈中所有小于num[i]的数
deque.removeLast();
deque.addLast(nums[i]);
res[i - k + 1] = deque.peekFirst(); //弹出队首的最大值,更新res
}
return res;
}
}