打家劫舍

一开始以为只有两个答案二选一,大意了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @param {number[]} nums
* @return {number}
*/
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
/**
* @param {number[]} nums
* @return {number}
*/
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
/**
* @param {number[]} nums
* @return {number}
*/
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;
};
// console.log("🚀 ~ rob([1, 2, 3, 1]):", rob([1, 2, 3, 1]));

本站由 ao 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。