代码
/**
* @param {number[]} nums
* @return {number}
*/
var rob = function(nums) {
// F(num) = Math.max(F(num - 1), F(num -2) + A(num))
// 特殊情况
if(nums.length <= 2) {
return Math.max(nums[0], nums[1] || 0)
}
// 遍历
let res1 = 0
let res2 = nums[0]
let res = 0
for(let i = 1; i < nums.length; i++) {
res = Math.max(res1 + nums[i], res2)
res1 = res2
res2 = res
}
return res
};
思路
动态规划问题。
F(n) = Math.max(F(n-2) + A(n), F(n-1))
当前打劫总金额只能出现两种情况:
- 与直至相邻店铺总金额一致。
- 与相隔两个店铺的总金额 + 当前店铺可打劫金额。
时间空间复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)