算法训练营第一期 | 爬楼梯

一、题目描述

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

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

注意:给定 n 是一个正整数。

示例 1:

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

示例 2:

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

二、题目解析

三、参考代码

1、Java 代码

class Solution {
    public int climbStairs(int n) {

        // 使用数组 dp 存储每一级台阶的爬法数量
        // 由于后面初始化 dp[1] 和 dp[2] 
        // 为了让当 n = 0 时不越界,保证 dp[1] 和 dp[2] 都有值
        // 所以 dp 的长度为 n + 2
        int[] dp = new int[ n + 2];

        // 初始化 dp[1] 和 dp[2] 
        // 一级台阶只有一种爬法
        dp[1] = 1;

        // 二级台阶有两种爬法
        // 一种爬法是先爬 1 个台阶,再爬 1 个台阶
        // 一种爬法是爬 2 个台阶
        dp[2] = 2;

        // 从 3 开始循环至 n,计算 dp[3] 至 dp[n]
        for(int i = 3; i <= n; i++) {
            // 第 i 级台阶的结果 dp[i] 等于第 i-1 和 i-2 的结果之和
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        // 最后返回 n 级台阶的结果
        return dp[n];
    }
}

2、C++ 代码

class Solution {
public:
    int climbStairs(int n) {

        // 使用数组 dp 存储每一级台阶的爬法数量
        // 由于后面初始化 dp[1] 和 dp[2] 
        // 为了让当 n = 0 时不越界,保证 dp[1] 和 dp[2] 都有值
        // 所以 dp 的长度为 n + 2
        vector<int> dp( n + 2 , 0 );

        // 初始化 dp[1] 和 dp[2] 
        // 一级台阶只有一种爬法
        dp[1] = 1;

        // 二级台阶有两种爬法
        // 一种爬法是先爬 1 个台阶,再爬 1 个台阶
        // 一种爬法是爬 2 个台阶
        dp[2] = 2;

        // 从 3 开始循环至 n,计算 dp[3] 至 dp[n]
        for(int i = 3; i <= n; i++) {
            // 第 i 级台阶的结果 dp[i] 等于第 i-1 和 i-2 的结果之和
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        // 最后返回 n 级台阶的结果
        return dp[n];

    }
};

3、Python 代码

class Solution:
    def climbStairs(self, n: int) -> int:
        # 使用数组 dp 存储每一级台阶的爬法数量
        # 由于后面初始化 dp[1] 和 dp[2] 
        # 为了让当 n = 0 时不越界,保证 dp[1] 和 dp[2] 都有值
        # 所以 dp 的长度为 n + 2
        dp = [0] * (n + 2)

        # 初始化 dp[1] 和 dp[2] 
        # 一级台阶只有一种爬法
        dp[1] = 1

        # 二级台阶有两种爬法
        # 一种爬法是先爬 1 个台阶,再爬 1 个台阶
        # 一种爬法是爬 2 个台阶
        dp[2] = 2

        # 从 3 开始循环至 n,计算 dp[3] 至 dp[n]
        for i in range(3, n + 1 ):
            # 第 i 级台阶的结果 dp[i] 等于第 i-1 和 i-2 的结果之和
            dp[i] = dp[i - 1] + dp[i - 2]

        # 最后返回 n 级台阶的结果
        return dp[n]

四、动画理解(没有声音)