这个问题可以使用动态规划(Dynamic Programming, DP)来解决。每次你可以爬 1 个或 2 个台阶,这意味着到达第 n 阶的方法数是到达第 n-1 阶的方法数加上到达第 n-2 阶的方法数。这是因为你可以从 n-1 阶跨一步到达第 n 阶,或者从 n-2 阶跨两步到达第 n 阶。
dp,其中 dp[i] 表示到达第 i 阶的方法数。dp[0] 设为 1(虽然 0 阶没有实际意义,但设为 1 便于计算)。dp[1] 设为 1(到达第 1 阶只有一种方法)。i 从 2 到 n,dp[i] = dp[i-1] + dp[i-2]。dp[n]。function climbStairs(n) {
if (n <= 1) return 1;
const dp = new Array(n + 1).fill(0);
dp[0] = 1;
dp[1] = 1;
for (let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
// 示例
console.log(climbStairs(2)); // 输出: 2
console.log(climbStairs(3)); // 输出: 3
console.log(climbStairs(4)); // 输出: 5
我们注意到,在计算 dp[i] 时,只需要用到 dp[i-1] 和 dp[i-2],因此我们可以用两个变量来代替数组,从而将空间复杂度优化为 O(1)。
function climbStairs(n) {
if (n <= 1) return 1;
let prev2 = 1, prev1 = 1;
for (let i = 2; i <= n; i++) {
let current = prev1 + prev2;
prev2 = prev1;
prev1 = current;
}
return prev1;
}
// 示例
console.log(climbStairs(2)); // 输出: 2
console.log(climbStairs(3)); // 输出: 3
console.log(climbStairs(4)); // 输出: 5
n 小于等于 1,直接返回 1,因为只有一种方法可以爬到楼顶。prev2 和 prev1,分别表示到达第 n-2 阶和第 n-1 阶的方法数。初始值都设为 1,因为 dp[0] 和 dp[1] 都是 1。n 阶:
current,它是前两阶方法数之和。prev2 为 prev1,prev1 为 current。prev1,它表示到达第 n 阶的方法数。通过上述方法,可以高效地计算出爬到楼顶的不同方法数。