描述
给定一个长度为 n 的数组 nums 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
基本思想:
用一个数组记录滑动窗口下标:
用一个循环中的变量i和这个数组去比较,一但有超出就shift移出
i指到的值如果比数组下标里的值大,则将数组清空,将i–push进去
i指到的值比下标数组里指到值小,则:又有两情况
==i指到的值大于队尾,则队尾出队
==i指到的值小于队尾,则i-push进队尾,等待机会上位
最后:当指针下标开始>=size-1时,每一次的指针移动,则会出现一个最大值
function maxInWindows(num, size)
{
// write code here
if (size === 0) {
return []
}
if (size === 1) {
return num
}
let queue = [0]
let max = []
for (let i = 1; i < num.length; i++) {
//queue中存储的是下标,当指针与最大值下标超过size,自动出队
if ((i - queue[0]) >= size) {
queue.shift()
}
//指针到的值大于队里最大值,清空,指针最大值入队
if (num[i] > num[queue[0]]) {
queue = []
queue.push(i)
} else {
//指针的值小于队里最大值,当大于队尾,则队尾出队(队尾是队内最小值,唯一机会是等前面的随窗口滑动被移出队列而成为最大值上位)
while (queue.length > 0 && num[i] > num[queue[queue.length-1]]) {
queue.pop()
}
//指针到的值小于队里最大值,且小于等于队尾,加入队尾行列,等机会上位
queue.push(i)
}
//根据窗口大小,当指针下标大于等于size-1时,才开始最大值输入,指针每移动一次,一个最大值
if (i >= size - 1) {
max.push(num[queue[0]])
}
}
return max
}
module.exports = {
maxInWindows : maxInWindows
};
牛客一直报错,不太理解错到哪儿了
function maxInWindows(num, size)
{
// write code here
if(size === 0||size>num.length) return []
let s = []
// for(let i = 0;i<(num.length-size+1);i++){
// let nums = []
// nums = num.slice(i,i+size)
// // nums.sort(function(a,b){return a-b})
// s.push(Math.max(...nums))
// }
//定义i-j为一个滑动窗口
let i = 0;
let j = size-1
//保证前提:滑动窗口的大小不超过num数组
while(j<num.length){
let nums = num.slice(i,i+size)
s.push(Math.max(...nums))
i++
j++
}
return s
}