概述
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
//如果数组的长度为0或者k的值为0,那么直接返回0即可
if(nums.length == 0 || k == 0){
return new int[0];
}
//建立一个双端队列用于存放过程中的值
Deque<Integer> deque = new LinkedList<>();
//存放结果的数组
int[] res = new int[nums.length - k + 1];
//刚开始滑动窗口里面没有k个元素,先用for移动滑动窗口,保证滑动窗口里面有k个元素
for(int i = 0; i < k;i++){
//想从队列的队头直接获取最大,就要保存队列里的元素是递减
//如果当队列中不为空且遍历到的nums[i]大于队列中的最后一个元素时,
//将队列中的最后一个元素移除,直到队列为空,或者遇到队列中的元素大于nums[i]
while(!deque.isEmpty()&&deque.peekLast() < nums[i]){//while
deque.removeLast();
}
//上述操作保证添加入队列里的值是单调递减以后,就可以num[i]加入到队列中
deque.addLast(nums[i]);//addLast
}
//在第一个滑动窗口形成的时候,它头部的第一个元素就是最大
res[0] = deque.peekFirst();
int n = nums.length ;
for(int i = k;i < n;i++){
//数组的第一个数不能和队列第一个数一样
//比如数组是[1,-1],k = 1,如果没有这一步判断,那么res[0] = 1 ,res[1] = 1,但实际上res[1] = -1
if(deque.peekFirst() == nums[i - k]){
deque.removeFirst();
}
//保证队列是单调递减的
while(!deque.isEmpty()&&deque.peekLast() < nums[i]){//while
deque.removeLast();
}
//保证递减后nums[i]将加入
deque.addLast(nums[i]);
//因为这个for循环是从k开始的,要减去k,就回到res数组的原位了,上面已经算出了res数组的一个元素,res下标要往后移动一位
res[i - k + 1] = deque.peekFirst();
}
//将最大值数组返回
return res;
}
}
最后
以上就是合适月光为你收集整理的滑动窗口最大值(LeetCode239)---队列(Java)的全部内容,希望文章能够帮你解决滑动窗口最大值(LeetCode239)---队列(Java)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复