快速实现生成窗口最大值数组(js代码)

一、你能学到什么?

①js数组内置的两种方法②生成窗口最大值数组的具体思路

先看代码(暴力求解)
//暴力求解 时间复杂度:O(n*w)
function largestWindow(arr,w){
    let arr1 = []
    for (let i = 0; i < arr.length-w+1; i++) { 
        let max = arr[i]
        for(j=1;j<w;j++){
            max = max>arr[i+j]?max:arr[i+j]
        }
        arr1.push(max)  
    }
    return arr1
}
简单代码
//利用双端队列实现窗口的最大值更新 时间复杂度:0(n)
function largestWindowa(arr,w){
let arr1 = []//用来存储窗体的下标
let arr2=[]//用作记录每次窗体的最大值
for (let i = 0; i < arr.length; i++) {
    if(arr1[0]<(i+1-w)){
        arr1.shift()
    }
    while(true){
        if(arr1.length==0){
            arr1.unshift(i)
            break
        }
        let j =arr1[arr1.length-1]
        if(i==0)break
        if(arr[j]>arr[i]){
        arr1.push(i)
        break
        }else {
            arr1.pop();
        }
    }
    if(i>=w-1){
        arr2.push(arr[arr1[0]])
    }
}
return arr2
}

具体思路

  • 如果数组的长度为 n ,窗口大小为 w ,则一共可以产生 n - w + 1个窗口最大值
  • arr1看作一个队列,存放的是arr的下标,有头有尾,有出队和入队规则
  • 出队规则:①当arr1队尾存的下标对应arr的值小于或等于当前arr[i]时,arr1队尾出队,然后再重新比较②当队头的下标过期时(arr1[0]<(i+1-w))
  • 入队规则:①当arr1为空时②当arr1队尾存的下标对应arr的值大于当前arr[i]时,队尾添加arr[i]的下标i

代码下载地址

想理解的更清楚,可以自己举个简单的例子,或者调试代码打印过程

感谢

如果感觉对您的学习工作有帮助,请将它分享给需要的人,或者点赞鼓励一下,感谢支持
你可以加个收藏,我还会不断更新。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值