- 解题思路
- 最大的值等于Math.max(第i个值+dp[i-2],dp[i-1]),前一个参数是选,后一个参数是不选
- 其中dp[i]表示前i个值的最大值
/**
* @param {number[]} nums
* @return {number}
*/
var rob = function(nums) {
if(nums==null||nums.length==0) return 0
if(nums.length == 1) return nums[0]
if(nums.length == 2) return Math.max(nums[0],nums[1])
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(nums[i]+dp[i-2],dp[i-1])
}
return dp[dp.length-1]
};
利用left,right做缓存
/**
* @param {number[]} nums
* @return {number}
*/
var rob = function(nums) {
if(nums==null||nums.length==0) return 0
if(nums.length == 1) return nums[0]
if(nums.length == 2) return Math.max(nums[0],nums[1])
// let dp = []
// dp[0] = nums[0]
// dp[1] = Math.max(nums[0],nums[1])
let left = nums[0]
let right = Math.max(nums[0],nums[1])
let result = right
for(let i = 2;i<nums.length;i++){
result = Math.max(nums[i]+left,right)
left =right
right = result
}
return result
};
- 解题思路
- 和打家劫舍1一样的思路,区别就是当选了第一个后不能选最后一个
- 所以要分为两种情况
- 1.选了第一个,遍历到倒数第二个
- 2.选第二个,遍历到倒数第一个
/**
* @param {number[]} nums
* @return {number}
*/
var rob = function(nums) {
if(nums==null||nums.length==0) return 0
if(nums.length == 1) return nums[0]
if(nums.length == 2) return Math.max(nums[0],nums[1])
return Math.max(rob2(nums,0,nums.length-2),rob2(nums,1,nums.length-1))
};
let rob2 = function(nums,start,end){
let left = nums[start]
let right = Math.max(nums[start],nums[start+1])
let result = right
for(let i = start+2;i<=end;i++){
result = Math.max(nums[i]+left,right)
left = right
right = result
}
return result
}