Evan Wang
Evan WangFrontEnd Developer
  • Evan Wang
    Evan WangFrontEnd Developer
  • 前端相关
  • 算法题
  • 日常笔记
  • Chat With AI

两数之和
两数相加
无重复字符的最长子串
最长回文子串
盛水最多的容器
三数之和
电话号码的字母组合
有效括号
合并两个有序链表
括号生成
下一个排列
搜索旋转排序数组
在排序数组中查找元素的第一个和最后一个位置
删除链表的倒数第n个节点
组合总和
全排列
旋转图像
字母异位词分组
最大子数组合
跳跃游戏
反转链表
反转链表2
合并区间
最小路径和
编辑距离
颜色分类
爬楼梯
组合
子集
不同的二叉搜索树
验证二叉搜索树
对称二叉树
二叉树的层序遍历
二叉树的最大深度
从前序与中序遍历序列构造二叉树
只出现一次的数字
二叉树展开为链表
最长连续序列
单词拆分
环形链表
环形链表2
排序链表
相交链表
乘积最大子数组
最小栈
多数元素
打家劫舍
数组中重复的数据
二叉树的中序遍历
卖股票的最佳时机
数组中的第K个最大元素

  1. Articles
  1. More
  2. 46-打家劫舍.mdx
目录
题目思路代码
928 字
约 3 分钟
更新于 2026/08/20

打家劫舍

题目

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

思路

动态规划。 最高金额,肯定是最后一家或者两家,即:nums[nums.length - 1] 或者 nums[nums.length - 2] 在当前位置 n 偷的最大的金额,等于在 Math.max(n-1 位置偷的最大金额, n-2 位置偷的最大金额 + nums 中对应位置的金额)

代码

var rob = function(nums) {
    if (nums.length <= 1) return nums[0]
    const dpArr = new Array(nums.length + 1) // 声明 dp 结果集数组,由于不偷的时候是 0 金额,所以长度比 nums 大 1
    dpArr[0] = 0 // 不偷的时候金额为 0
    dpArr[1] = nums[0] // 只偷一家的时候金额为 nums[0]
    for (let i = 2; i < dpArr.length; i++) { // 从 dpArr[2] 开始循环,计算每一个位置上可以偷取的最大金额,
        dpArr[i] = Math.max(dpArr[i - 1], dpArr[i - 2] + nums[i - 1])
    }
    return dpArr[dpArr.length - 1] // 最后返回最后一位的金额即为最大金额
};