news 2026/9/30 14:32:54

【 每天学习一点算法 2026/01/04】打家劫舍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【 每天学习一点算法 2026/01/04】打家劫舍

每天学习一点算法 2026/01/04

题目:打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

新年新开始,坚持学习算法。

又是一道动态规划的问题,我们来分析一下,我们入按照数组顺序的挨个计算在每个房间的能偷窃到的最高金额会有哪些情况呢?很明显,每个房间就只存在两种情况(偷/不偷),那我们来逐个房间分析,并将每个偷与不偷能窃到的最大金额用一个二维数组存储起来。

  • 第一个房间:两种可能0或者nums[0],arr[0] = [0, nums[0]]

  • 第二个房间:两种可能

    1. 如果这个房间不偷那就是截至上一个房间偷到的最高金额(因为这是第二房间所以一定是nums[0])
    2. 如果这个房间偷,那肯定是上一个房间未偷盗情况下的金额 + 这个房间的金额

    arr[1] = [nums[0], arr[0][0] + nums[1]]

  • 第 n 个房间:根据第二房间的分析我们可以知道,如果这个房间为偷取,我们应该拿到上一个能够偷窃到的最高金额(Math.max(arr[n - 1][0], arr[n - 1][1])),所以arr[n] = [Math.max(arr[n - 1][0], arr[n - 1][1]), arr[n - 1][0] + nums[n]]

这样我们就成功找到了房间能够偷窃到的最高金额的规律

functionrob(nums:number[]):number{if(nums.length===1)returnnums[0]// 如果只有一个房间直接返回letarr=[[0,nums[0]]]// 二维数组存储房间最高金额情况 [未盗窃, 已盗窃][]// 循环计算每个房间的情况for(leti=1;i<nums.length;i++){arr.push([Math.max(arr[i-1][0],arr[i-1][1]),arr[i-1][0]+nums[i]])}// 返回最后一个房间的最大金额constlast=arr.pop()returnMath.max(last[0],last[1])};

我们可以看到每次循环都只用到了前一个房间的数据,所以我们可以考虑不用数组而是用两个变量来存储上一个房间的值。

functionrob(nums:number[]):number{if(nums.length===1)returnnums[0]// 如果只有一个房间直接返回letpreMax=nums[0]// 存储上一个房间能够偷窃到的最高金额letpreNo=0// 存储未偷盗情况下的最高金额// 循环计算每个房间的情况for(leti=1;i<nums.length;i++){constpreDo=preNo+nums[i]// 当前房间已偷盗preNo=preMax// 当前房间未偷盗为上一个房间的最大值preMax=Math.max(preNo,preDo)// 当前房间最大值为 当前房间未偷盗和已偷盗的最大值}// 返回最后一个房间的最大金额returnpreMax};

题目来源:力扣(LeetCode)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 4:49:12

基于MPI的并行计算科学模拟操作指南

从零构建高性能科学模拟&#xff1a;MPI并行计算实战精讲 你有没有遇到过这样的场景&#xff1f;写好了一个流体仿真程序&#xff0c;本地测试跑得挺顺&#xff0c;结果一放到集群上处理真实尺度的网格——几个小时都出不来结果。或者更糟&#xff0c;内存直接爆掉&#xff0c…

作者头像 李华
网站建设 2026/9/30 4:49:11

零基础入门:处理Multisim主数据库连接错误

零基础也能搞定&#xff1a;Multisim主数据库打不开&#xff1f;一文扫清所有障碍 你有没有遇到过这样的情况——兴冲冲打开 Multisim 准备画个电路仿真&#xff0c;结果弹出一个红框&#xff1a;“ 无法访问主数据库 ”或“Unable to open the master database”&#xff0c…

作者头像 李华
网站建设 2026/9/30 4:49:11

一文说清智能小车PCB板原理图关键模块连接方式

智能小车PCB设计实战&#xff1a;从原理图到稳定运行的关键连接逻辑你有没有遇到过这样的情况&#xff1f;精心写好的控制代码烧进板子&#xff0c;结果小车一通电就复位、电机嗡嗡响却不转、传感器数据跳得像醉酒的指针……最后折腾半天才发现&#xff0c;问题不在程序&#x…

作者头像 李华
网站建设 2026/9/29 14:07:45

UART通信中波特率设置的核心要点

UART通信中波特率设置的核心要点&#xff1a;从原理到实战的深度解析 你有没有遇到过这样的场景&#xff1f;MCU代码烧录成功&#xff0c;串口线也接好了&#xff0c;但终端就是收不到任何输出——满屏乱码&#xff0c;或者干脆静默如谜。反复检查接线、换电脑、重启工具……最…

作者头像 李华
网站建设 2026/9/29 5:12:02

Keil5乱码问题根源分析:聚焦工业自动化开发环境

Keil5中文注释乱码问题的根源与工业级解决方案在工业自动化领域&#xff0c;嵌入式开发早已不是少数极客的“个人秀”&#xff0c;而是涉及多团队协作、长期维护和高可靠性要求的系统工程。作为ARM Cortex-M系列微控制器最主流的开发环境之一&#xff0c;Keil MDK&#xff08;尤…

作者头像 李华
网站建设 2026/9/29 14:07:43

RS232串口通信原理图在工业控制中的深度剖析

RS232串口通信原理图在工业控制中的真实价值&#xff1a;从芯片到布线的实战解析你有没有遇到过这样的场景&#xff1f;现场一台老式温控仪表突然不上传数据了&#xff0c;HMI上温度显示“N/A”。你打开调试工具&#xff0c;发现串口完全静默——TXD线上没有一点电平跳动。可设…

作者头像 李华