/** * @param {number[]} nums * @return {number} */ const rob = function (nums) { }; /* 设dp[i]为偷取第i家时获取的最大利润,那么dp[i]可以由两种情况得来 1.偷第i家,如果偷第i家,那么最大利润为 dp[i] = dp[i-2] + 第i家拥有的金额 2.不偷第i家,如果不偷第i家,那么最大利润为 dp[i-1]的最大利润 那么只需比较上面两种情况谁大,就是dp[i]的值,即dp[i] = Max(dp[i-1], dp[i-2] + nums[i]) */ function f1(nums) { const n = nums.length; const dp = Array(n); dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]); for (let i = 2; i < dp.length; i++) { dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]); } return dp[n - 1]; } /* 使用双指针优化 */ function f2(nums) { let prev = 0; let curr = 0; for (const num of nums) { const temp = Math.max(curr, prev + num); prev = curr; curr = temp; } return curr; }