博主主页: 码农派大星.
数据结构专栏:Java数据结构
数据库专栏:数据库
JavaEE专栏:JavaEE
软件测试专栏:软件测试
关注博主带你了解更多知识
解析:
双端队列:
遍历nums数组 , k 是窗口长度,找出窗口中最大值返回
为了保证队列单调递减的单调性
入队之前先判断 :
队列中存的是nums元素的索引
当队列不为空并且队尾元素所对应的nums值 小于等于 当前遍历的 nums[i]时
弹出/删除队尾元素值(就是相应nums索引)
入队: q.addList(i);
出队之前判断:
只有在窗口长度 >= k 时才出队列
i - q.getFirst( ) >= k
出队:
q.removeFirst()
统计结果 :
只有在 i >= k-1时统计结果:
ret[i-k+1] = nums[q.getFirst()]
最后返回ret
代码:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] ret = new int[n - k + 1];
Deque<Integer> q = new ArrayDeque<>(); //双端队列
for(int i =0; i < n ; i++){
//入队列
while(!q.isEmpty() && nums[q.getLast()] <= nums[i]){
q.removeLast();
}
q.addLast(i); //入队
//出
if(i - q.getFirst() >= k){
q.removeFirst();
}
//统计结果
if (i >= k -1){
ret[i - k + 1] = nums[q.getFirst()];
}
}
return ret;
}
}