关键区别 | 典例代表 | |
---|---|---|
动态规划 | 子问题相互重叠 | 斐波那契数列 |
分而治之 | 子问题独立 | 翻转二叉树 |
输入:n = 3
输出:3
解释:有3种方法可以爬到楼顶
- 1 阶 + 1 阶 + 1阶
- 2 阶 + 1 阶
- 1 阶 + 2 阶
// 空间复杂度:O(n) function climbStairs(n) { if(n < 2) { return 1; } let dp = [1, 1]; for(let i = 2; i <= n; i++) { dp[i] = dp[i-1] + dp[i-2]; } return dp[n] } // 空间复杂度:O(1) function climbStairs(n) { if(n < 2) { return 1; } let dp0 = 1, dp1 = 1; for(let i = 2; i <= n; i++) { const temp = dp0; dp0 = dp1; dp1 = dp1 + temp; } return dp1 }
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)
偷窃到的最高金额 = 1 + 3 = 4
// 空间复杂度: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[dp.length - 1] } // 空间复杂度:O(1) function rob(nums) { if(nums.length === 0) { return 0; } let dp0 = 0, 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 }