动态规划,用数组来记录当前房子为K个时,最多能偷到dp[k]的钱,边界为dp[0]=nums[0],一个房子则获取它;dp[1]=Math.max(nums[0], nums[1]),两个房子取最大值,三个以上,对于第k个房子,取它则不能取k-1的房子,结果为dp[k-2]+nums[k],不取则取k-1的房子,结果为dp[k-1],可以推出动态方程:dp[k]=Math.max(dp[k-1], dp[k-2]+nums[k])
var rob = function(nums) {
if(nums.length<1) return 0
let dp = []
dp[0] = nums[0]
dp[1] = Math.max(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]
};
// 压缩空间
var rob = function(nums) {
if(nums.length<1) return 0
let a = nums[0]
let b = Math.max(nums[0], nums[1])
let c = b
for(let i=2; i<nums.length;i++){
c = Math.max(b, a+nums[i])
b = a
a = c
}
return c
};
网友评论