198.打家劫舍
var rob = function(nums) {
//数组问题 动态规划 nums[i]是下标为i的数组之前的 可以盗取的最大金额
let dp = []
let n = nums.length
dp[0] = nums[0]
dp[1] = Math.max(nums[0],nums[1])
for(let i=2;i<n;i++){
//取 盗取当前的结点 和 不盗取当前节点 二者的最大值
dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1])
}
return dp[n-1]
};
213.打家劫舍2
var rob = function(nums) {
//这题比上一个多了一个限定条件 所有的房屋围成了一个圈
//第一个和最后一个不能同时出现
let n = nums.length
if(n==0) return 0
if(n==1) return nums[0]
let dp1 = []
let dp2 = []
//不包含第一个 队列从 1 到 n-1
dp1[1] = nums[1]
dp1[2] = Math.max(nums[1],nums[2])
for(let i = 3;i<=n-1;i++){
dp1[i] = Math.max(nums[i]+dp1[i-2],dp1[i-1])
}
//包含第一个 队列从 0 到 n-2
dp2[0] = nums[0]
dp2[1] = Math.max(nums[0],nums[1])
for(let j=2;j<=n-2;j++){
dp2[j] = Math.max(nums[j]+dp2[j-2],dp2[j-1])
}
return Math.max(dp1[n-1],dp2[n-2])
};