LeetCode 热题 100_爬楼梯(81_70_简单_C++)(动态规划)

发布于:2025-03-28 ⋅ 阅读:(31) ⋅ 点赞:(0)

题目描述:

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

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

输入输出样例:

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

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

提示:
1 <= n <= 45

题解:

解题思路:

思路一(动态规划):

1、这道题最主要的是分析出怎么解决爬楼梯,能否找到一定的规律。们发现,当我们爬第n层台阶的时候可以从n-1层台阶或n-2层台阶爬上来。
① 当楼梯数n=1时 有1种方法:1
② 当楼梯数n=2时 有2种方法:1+1,2
③ 当楼梯数n=3时 有3种方法:1+1+1,2+1;1+2。可以转换成从n=1爬2个台阶上来,和n=2爬1层台阶上来。
④ 当楼梯数n=4时 有5种方法:1+1+1+1,2+1+1,1+2+1;1+1+2,2+2。可以转换成从n=2爬2个台阶上来,和n=3爬1层台阶上来。
⑤ 我们发现f(n)=f(n-1)+f(n-2),正好符合斐波那契数列。

2、复杂度分析:
① 时间复杂度:O(n)。从第一层爬到第n层。
② 空间复杂度:O(1)。

代码实现

代码实现(思路一(动态规划)):
class Solution {
public:
    int climbStairs(int n) {
        // 初始化:
        // a = 1:表示爬到第 0 阶(地面)的方式数为 1
        // b = 1:表示爬到第 1 阶的方式数为 1
        // sum = 1:用于计算当前计算的阶梯方式数
        int a = 1, b = 1, sum = 1;

        // 循环直到 n 减少到 1
        // 计算从第 2 阶到第 n 阶的方式数,依次更新 a 和 b 的值
        while (n - 1) {
            // sum 存储爬到当前阶数(第 n 阶)的方式数
            // 当前阶数的方式数等于爬到前一阶(a)和前两阶(b)的方式数之和
            sum = a + b;

            // 更新 a 和 b:
            // a 更新为 b,表示爬到第 n 阶的方式数
            a = b;

            // b 更新为 sum,表示爬到下一个阶数(第 n+1 阶)的方式数
            b = sum;

            // 每次循环将 n 减少 1,直到 n 为 1 时退出循环
            --n;
        }

        // 返回 b,最终它存储的是爬到第 n 阶的方式数
        return b;
    }
};
以思路一为例进行调试
#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    int climbStairs(int n) {
        // 初始化:
        // a = 1:表示爬到第 0 阶(地面)的方式数为 1
        // b = 1:表示爬到第 1 阶的方式数为 1
        // sum = 1:用于计算当前计算的阶梯方式数
        int a = 1, b = 1, sum = 1;

        // 循环直到 n 减少到 1
        // 计算从第 2 阶到第 n 阶的方式数,依次更新 a 和 b 的值
        while (n - 1) {
            // sum 存储爬到当前阶数(第 n 阶)的方式数
            // 当前阶数的方式数等于爬到前一阶(a)和前两阶(b)的方式数之和
            sum = a + b;

            // 更新 a 和 b:
            // a 更新为 b,表示爬到第 n 阶的方式数
            a = b;

            // b 更新为 sum,表示爬到下一个阶数(第 n+1 阶)的方式数
            b = sum;

            // 每次循环将 n 减少 1,直到 n 为 1 时退出循环
            --n;
        }

        // 返回 b,最终它存储的是爬到第 n 阶的方式数
        return b;
    }
};
    
    

int main(){
    Solution s;
    cout<<s.climbStairs(7);
    return 0;
}

LeetCode 热题 100_爬楼梯(81_70)原题链接
欢迎大家和我沟通交流(✿◠‿◠)