解题步骤
- 定义子问题:f(k) = max ( f(k-2) + ak , f(k-1) )
- 反复执行:从2循环到 n,执行上述公式
通过动态规划的方式实现
- 时间复杂度:O (n)
空间复杂度:O (n)
function rob(nums) {
if (nums.length === 0) return 0;
const dp = [0, nums[0]];
for (let i = 2; i <= nums.length; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i - 1], dp[i - 1]);
}
return dp[nums.length];
}
代码中存在一个循环,所以时间复杂度是 O (n)。而空间复杂度也是 O (n),因为使用了数组存储数据,数据会随着 n 增大而增大。
通过动态规划的方式实现(优化后)
- 时间复杂度:O (n)
空间复杂度:O (1)
function rob(nums) {
if (nums.length === 0) return 0;
let dp0 = 0;
let dp1 = nums[0];
for (let i = 2; i <= nums.length; i++) {
const dp2 = Math.max(dp0 + nums[i - 1], dp1);
dp0 = dp1;
dp1 = dp2;
}
return dp1;
}
代码中存在一个循环,所以时间复杂度是 O (n)。而空间复杂度是 O (1),因为把数据存储的方式改成了单个变量的存储方式。