动态规划
不能连续的抢劫两家,对于这里的状态转移方程就是
当前的这一家不抢 vs 抢劫当前这一家,选取一个最大值
dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i])
dp题解
var rob = function (nums) {
let n = nums.length
if (n === 0) {
return 0
} else if (n === 1) {
return nums[0]
} else if (n === 2) {
return Math.max(nums[0], nums[1])
}
let dp = new Array(n).fill(0)
dp[0] = nums[0]
dp[1] = Math.max(nums[0], nums[1])
let res = 0
for (let i = 2; i < n; ++i) {
dp[i] = Math.max(dp[i - 1], nums[i] + dp[i - 2])
// 记录最大值
res = Math.max(res, dp[i])
}
return res
};
空间复杂度:O(n)
var rob = function (nums) {
let n = nums.length
if (n === 0) return 0
if (n === 1) return nums[0]
let prev2 = 0, prev1 = nums[0]
for (let i = 1; i < n; ++i) {
// 不抢 vs 抢
let current = Math.max(prev1, prev2 + nums[i])
prev2 = prev1
prev1 = current
}
return prev1
};
空间复杂度:O(1)
类似于斐不拉契数列,这里要维护一个数组,是属于可以但是没必要,因为就跟前两个状态相关,不需要记录太多,所以可以优化空间复杂度,只记录前两个状态即可。