var climbStairs = function(n) {
let dp = []
dp[0] = 1
dp[1] = 2
if(n < 2) return dp[n-1]
for(let i = 2; i < n; i++) {
let temp = dp[0] + dp[1]
dp[0] = dp[1]
dp[1] = temp
}
return dp[1]
};二刷 2026-09-20:滚动变量解构赋值,注意初始值与返回值语义对齐。 三刷 2026-10-15:解构滚动优化至两变量
[a, b] = [b, a+b],空间 O(1)。
var maxSubArray = function(nums) {
let res = nums[0], pre = nums[0]
for(let i = 1; i < nums.length; i++) {
pre = Math.max(nums[i], nums[i]+ pre)
res = Math.max(res, pre)
}
return res
};var coinChange = function (coins, amount) {
let dp = new Array(amount + 1).fill(Infinity);
dp[0] = 0
for (let coin of coins) {
for (let i = coin; i <= amount; i++) {
dp[i] = Math.min(dp[i], dp[i-coin]+1)
}
}
return dp[amount] === Infinity ? -1 : dp[amount]
};详解:
dp[i]:凑出金额i的最少硬币数;外层硬币、内层金额、i 正向(完全背包,硬币可无限复用)dp[i] === Infinity则凑不出来,返回 -1- 完整思路(遍历方向辨析、倒序变 0-1 背包、换序问题)见 322 零钱兑换
-
二刷 2026-09-20:完全背包模型正序遍历,顺利一次 AC。
var canPartition = function(nums) {
const sum = nums.reduce((a, b) => a+b, 0)
if(sum % 2 !== 0) {
return false
}
const target = sum / 2
const dp = new Array(target + 1).fill(false)
dp[0] = true
for(const num of nums){
for(let i = target; i >= num; i--) {
dp[i] = dp[i] || dp[i-num]
}
}
return dp[target]
};二刷 2026-09-21:0-1 背包模型,容量逆序遍历防重复选取,布尔状态压缩一次 AC。
var uniquePaths = function (m, n) {
const dp = new Array(n).fill(1)
for(let i = 1; i < m; i++) {
for(let j = 1; j< n; j++) {
dp[j] += dp[j-1]
}
}
return dp[n-1]
};二刷 2026-09-21:一维数组滚动优化,dp[j] += dp[j-1] 状态压缩一次 AC。
相关笔记
- Kadane 算法题目(最大子数组和)
- 动态规划基础(爬楼梯、状态转移)
- 动态规划专题(不同路径、编辑距离等)
- 背包与贪心题目(分割等和子集)
- LeetCode Hot100 位运算与动态规划(零钱兑换)
- 322 零钱兑换(零钱兑换完整解题思路)