每日一题——LeetCode1652.拆炸弹

方法一 分类讨论

  • k=0,直接返回一个和原数组长度一样但元素都为0的数组
  • k>0,先求出前k个元素的和preSum,初始化index=k,每次循环preSum减去当前元素codei,再加上codeindex,保证preSum的值始终是当前元素后k个元素的和,如果index到了数组末尾需要跳转到数组开头
  • k<0,同理,只是index记录的是需要减去的元素的位置,preSum先减codeindex,然后加上codei的前一个元素,preSum始终记录的是codei前k个元素的和

写完后发现k>0 ,k<0方法其实是一样的,考虑是否能将这两种情况合并,缩减代码

javascript 复制代码
var decrypt = function(code, k) {
    if(k===0) return new Array(code.length).fill(0)
    let res=[]
    if(k>0){
        let preSum=0,index=k
        for(let i=0;i<k;i++){
            preSum+=code[i]
        }
        for(let i=0;i<code.length;i++){
            preSum-=code[i]
            preSum+=code[index]
            if(index==code.length-1){
                index=-1
            }
            index++
            res.push(preSum)
        }
    }else{
       let index=code.length+k,preSum=0
       for(let i=index;i<code.length;i++){
           preSum+=code[i]
       } 
       res.push(preSum)
       for(let i=0;i<code.length-1;i++){
           preSum-=code[index]
           if(index==code.length-1){
               index=-1
           }
           index++
           preSum+=code[i]
           res.push(preSum)
       }
    }
    return res
};

消耗时间和内存情况:

方法二 滑动窗口

无论k大于0还是小于0,其实都是一个长度为k的绝对值的窗口,窗口往右移动,每次去掉窗口的第一个值,加入窗口的后一个值,当窗口的左边界或右边界到达数组末尾就要跳转到数组开头,每次窗口的和就是一个密码值

javascript 复制代码
var decrypt = function(code, k) {
    if(k===0) return new Array(code.length).fill(0)
    let res=[],start=0,end=0,preSum=0
    if(k>0){
       start=0,end=k-1
    }else{
       start=code.length+k-1,end=start-k-1
    }
    for(let i=start;i<=end;i++){
        preSum+=code[i]
    }
    for(let i=0;i<code.length;i++){
        preSum-=code[start]
        start++
        if(start==code.length) start=0

        end++
        if(end==code.length) end=0
        preSum+=code[end]

        res.push(preSum)
    }
    return res
};

消耗时间和内存情况:

相关推荐
wabs6661 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964131 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
zhangyao9403302 小时前
开发pc端时,表格的高度怎么设置才能铺满页面
前端·javascript·elementui
嗝o゚2 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本2 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
XinZong2 小时前
实测OpenClaw虾淘:全民工具AI时代,冷门非工具类的Skill还能出圈吗?
javascript
烛衔溟2 小时前
TypeScript 类的类型 —— 作为类型使用
javascript·ubuntu·typescript
之歆3 小时前
Day16_JavaScript 轮播图与事件工程实战(下篇)
服务器·开发语言·前端·javascript·网络·性能优化
kyriewen3 小时前
我关掉了Copilot:因为我写的代码出现在了别人的建议里
前端·javascript·ai编程
Ulyanov4 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真