原题链接
首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。
如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 间房屋,有两个选项:
偷窃第 间房屋,那么就不能偷窃第 间房屋,偷窃总金额为前 间房屋的最高总金额与第 间房屋的金额之和。
不偷窃第 间房屋,偷窃总金额为前 间房屋的最高总金额。
在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 间房屋能偷窃到的最高总金额。
用 表示前 间房屋能偷窃到的最高总金额,那么就有如下的状态转移方程:
边界条件为:
最终的答案即为 ,其中 是数组的长度。
复杂度分析
时间复杂度:,其中 是数组长度。只需要对数组遍历一次。
空间复杂度:。使用滚动数组,可以只存储前两间房屋的最高总金额,而不需要存储整个数组的结果,因此空间复杂度是 。
typescript
function rob(nums: number[]): number {
if(!nums.length) {
return 0;
}
if(nums.length === 1) {
return nums[0];
}
const dp = [];
dp[0] = nums[0];
dp[1] = nums[0] > nums[1] ? nums[0] : nums[1];
for(let i = 2; i < nums.length; i++) {
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
}
return dp[nums.length - 1];
};