LeetCode 70. 爬楼梯

1 阅读2分钟

LeetCode 70. 爬楼梯

摘要

LeetCode 70 爬楼梯题解,使用动态规划法,每级台阶的走法数等于前两级台阶走法数之和,时间复杂度 O(n),空间复杂度 O(n)。

标签

#算法 #LeetCode #动态规划 #题解

目录

  1. 题目描述
  2. 易错点
  3. 思路
  4. 编写代码

1. 题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

text

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:

text

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45

2. 易错点

  1. 当 n == 1 时,只有 1 种方法,需要单独处理
  2. 当 n == 2 时,有 2 种方法,需要单独处理
  3. 动态规划数组长度为 n + 1,索引从 0 开始,需确保访问不越界
  4. 循环从 3 开始计算,直到 n,需要正确初始化 floor[1] 和 floor[2]
  5. 返回值为 floor[n],而不是 floor[n-1]

3. 思路

采用动态规划法解决爬楼梯问题:

  • 到达第 n 级台阶,可以从第 n-1 级爬 1 步到达,也可以从第 n-2 级爬 2 步到达
  • 因此状态转移方程为:dp[n] = dp[n-1] + dp[n-2]
  • 初始条件:dp[1] = 1(1 级台阶 1 种方法),dp[2] = 2(2 级台阶 2 种方法)
  • 从第 3 级开始递推,直到计算出 dp[n]
  • 返回 dp[n] 即为最终答案

该问题本质上是斐波那契数列的应用,时间复杂度 O(n),空间复杂度 O(n)。


4. 编写代码

c 运行

c

int climbStairs(int n) {
    if(n == 1)
        return 1;
    if(n == 2)
        return 2;
    int * floor = (int*)malloc((n+1)*sizeof(int));
    floor[1] = 1;
    floor[2] = 2;
    int now = 1;
    while(now <= n) {
        if(now >= 3) {
            floor[now] = floor[now-1] + floor[now-2];
        }
        now++;
    }
    return floor[n];
}