题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例 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 。
解决
第一次刷到这道题,以我的算法水平,首先想到的是奇偶数分别相加,然而没有通过,我就知道没有这么简单。应该用自低向上的动态规划的方法来解这道题。对于动态规划的理解,可以看下这篇博客算法-动态规划。
public static int rob(int[] nums) {
if(nums.length == 0) {
return 0;
}
if(nums.length == 1) {
return nums[0];
}
//因为数字不能相邻,所以在求解最新解时需要知道上一次的解和当前的解
int[] temp = {nums[0], Math.max(nums[0], nums[1])};
for(int i=2;i<nums.length;i++) {
int t = temp[1];
temp[1] = Math.max(temp[0]+nums[i], temp[1]);
temp[0] = t;
}
return temp[1];
}
本文探讨了一道经典的算法题目,即如何在不触动相邻房屋警报系统的情况下,计算能够偷窃到的最高金额。通过分析,我们发现直接的奇偶数相加策略并不适用,而采用自底向上的动态规划方法才是解决问题的关键。文章提供了详细的解决方案,并附带了Java代码实现。
2308

被折叠的 条评论
为什么被折叠?



