动态规划:打家劫舍 ⛄
打家劫舍
题目地址: https://leetcode-cn.com/problems/house-robber/
题目描述:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例
复制代码
复制代码
题目分析
本题是一道非常经典的动态规划算法题目,在本题当中,可能一开始会先想到使用贪心算法进行局部最优解进行偷窃,但是最后一步一步取最优对本题是会走进死胡同的。
本题应该像之前做前缀和类似,定义一个sum
数组,这是用来记录从第一家开始到最后一家,到达每一家时能获取到的最大金额。
首先第一家金额肯定是 nums[0],而到第二家最大金额是Math.max(nums[0], nums[1])
,第一家与第二家做对比,取金额更大的一家。
第三家的金额则是Math.max(nums[1], nums[0]+nums[2])
,因为打家劫舍不能够相邻,所以第三家可以累积的最大金额是第二家金额与(第一家 + 第三家)金额做对比。
同理,后面的每一家金额也是类似于第三家的累积金额获取方式
以[1,2,3,1]
为例,得到的sum
数组为[1,2,4,4]
最终返回结果是sum[sum.length - 1]
代码
复制代码
版权声明: 本文为 InfoQ 作者【空城机】的原创文章。
原文链接:【http://xie.infoq.cn/article/1f5f911b65fc7fe15af857b87】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论