LC-198. 打家劫舍

136 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

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

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

示例 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

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

题解

这道题算是 动态规划的一个进阶版,但是思路是不变的,依旧是需要先找到递归公式。

我们创建一个数组,为到达每个房子,所能获得的最大值。

注意:不能获取两间相邻的房子

所以我们比较 dp[i - 1]dp[i - 2] + nums[i]的值即可

动态规划

const rob = (nums) => {
  const numsLength = nums.length

  // 创建一个到达某个房子 并 获取到钱,所得到的最大的值的数组
  const dp = new Array(numsLength)

  dp[0] = nums[0]
  dp[1] = Math.max(nums[1], nums[0])

  for (let i = 2; i < numsLength; i++) {
    // 需要比较,第i个房子,最多能获得多少钱
    dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i])
  }

  // 由于我们不需要考虑,偷的是哪几栋房子,只需要考虑,钱最多即可,直接返回最后一项即可
  return dp[numsLength - 1]
}

总结

题目 26 :所谓动态规划,就是需要我们找到重要的递推公式,一定要找到相关的规律。