专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

每天一道算法题——打家劫舍 打家劫舍的意思解释

ins518 2024-09-29 18:30:49 技术文章 195 ℃ 0 评论

题目

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

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


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


思路

首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。

如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k~(k>2) 间房屋,有两个选项:

偷窃第 k间房屋,那么就不能偷窃第 k-1 间房屋,偷窃总金额为前 k-2间房屋的最高总金额与第 k 间房屋的金额之和。

不偷窃第 k 间房屋,偷窃总金额为前 k-1 间房屋的最高总金额。

在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k 间房屋能偷窃到的最高总金额。

用 dp[i] 表示前 i 间房屋能偷窃到的最高总金额,那么就有如下的状态转移方程:

dp[i]=max(dp[i?2]+nums[i],dp[i?1])

代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var rob = function(nums) {
  	// 如果数组长度为0,直接返回0
    if (nums.length <= 0) {
        return 0
    }
  	// 初始化dp的前两个值
    const dp = [nums[0], Math.max(nums[0], nums[1])]
    if (nums.length > 2) {
        for (let i = 2; i < nums.length; i++) {
          	// 写上动态规划方程
            dp[i] = Math.max(dp[i-2] + nums[i], dp[i-1])
        }
    }
    return dp[nums.length - 1]
};

更多算法题

每天一道前端算法题--回溯算法--N皇后问题

每天一道算法题——子集

每天一道算法题——分发饼干

每天一道算法题(快速排序)

每天一道算法题——斐波那契数

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表