【 每天学习一点算法 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]]

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

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

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

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

题目来源:力扣(LeetCode)

相关推荐
DuHz18 分钟前
论文解读:用于数据分析的极值点对称模态分解方法 (Extreme-point Symmetric Mode Decomposition,ESMD)
论文阅读·算法·信息与通信·信号处理
HZZD_HZZD37 分钟前
用电负荷聚类分析实战:基于`scikit-learn`的`K-Means`与`DBSCAN`双算法对比、`PCA`降维可视化与智能电表负荷画像全流程
算法·scikit-learn·kmeans
MIngYaaa5201 小时前
2026暑期牛客多校1 2026-7-17
数据结构·算法
wabs6661 小时前
关于图论【卡码网107.寻找存在的路线的思考】
数据结构·算法·图论
半兽先生1 小时前
大模型技术开发与应用——4.大模型提示词工程实战
人工智能·算法
艾莉丝努力练剑1 小时前
【Linux:动静态库】Linux 动静态库与可执行文件
linux·运维·服务器·学习·面试·文件系统·动静态库
wuminyu2 小时前
JUC组件逐层剥离与深度剖析
java·linux·c语言·jvm·c++·算法
宁风NF2 小时前
JavaScript:内存、垃圾回收、性能优化
开发语言·前端·javascript·学习·性能优化·es6
hhzz2 小时前
机器学习-算法模型系列文章:07-SVM 一巴掌拍出来的超平面:SVM核函数选错,再干净的数据也救不了你
算法·机器学习·支持向量机
编程圈子2 小时前
电机驱动开发学习22. 霍尔电角度标定(自动/手动标定与Flash固化)
驱动开发·学习