【js刷题--栈】JZ59 滑动窗口的最大值-----不太懂,先记录下来

描述
给定一个长度为 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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值