一开始以为只有两个答案二选一,大意了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
var rob = function (nums) { let oddSum = 0, evenSum = 0; for (let i = 0; i < nums.length; i++) { if (i % 2 === 0) { evenSum += nums[i]; } else { oddSum += nums[i]; } } return Math.max(oddSum, evenSum); };
|
动态规划
方程公式:f(x) = Math.max(f(x-1), f(x-2)+nums[i])
f(x)
代表以x(x>=2)
索引为结尾能偷窃到的最高金额
初始值:
f(0)=nums[0]
f(1)=Math.max(nums[0], nums[1])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
var rob = function (nums) { if (nums.length === 1) return nums[0]; else if (nums.length === 2) return Math.max(nums[0], nums[1]); const dp = new Array(nums.length); 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]; };
|
空间优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
var rob = function (nums) { let cur = 0, prev = 0; for (const num of nums) { const temp = Math.max(cur, prev + num); prev = cur; cur = temp; } return cur; };
|