滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof
算法流程:
初始化: 双端队列 dequedeque ,结果列表 resres ,数组长度 nn ;
滑动窗口: 左边界范围 i \in [1 - k, n - k]i∈[1−k,n−k] ,右边界范围 j \in [0, n - 1]j∈[0,n−1] ;
若 i > 0i>0 且 队首元素 deque[0]deque[0] == 被删除元素 nums[i - 1]nums[i−1] :则队首元素出队;
删除 dequedeque 内所有 < nums[j]<nums[j] 的元素,以保持 dequedeque 递减;
将 nums[j]nums[j] 添加至 dequedeque 尾部;
若已形成窗口(即 i \geq 0i≥0 ):将窗口最大值(即队首元素 deque[0]deque[0] )添加至列表 resres ;
返回值: 返回结果列表 resres
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var maxSlidingWindow = function(nums, k) {//假设k=3
let res=[];
let deque=[];
for(let j =0 ,i=1-k;j <nums.length;i++,j++ ){//i从-2开始,j从0开始遍历递增,
if(i>0 && deque[0]===nums[i-1]) deque.shift();//若队首元素即最大元素deque[0]=被删除元素i-1,则窗口deque的最大元素删除出队
while(deque.length && deque[deque.length-1]<nums[j]){
//j每次增加,删除 deque内所有小于j的元素,以保持 deque中的数组递减
deque.pop();
}
deque.push(nums[j]);
if(i>=0) res[i]=deque[0];
}
return res;
};
阅读剩余
版权声明:
作者:chun
链接:https://chun53.top/1062.html
文章版权归作者所有,未经允许请勿转载。
THE END