力扣70. 爬楼梯

题目来源(力扣):

https://leetcode.cn/problems/climbing-stairs/description/

题目描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

基本思路:

假设一次只能走1个台阶,到达第n个台阶的方案实际上就是到达第n-1个台阶的方案,即dp[i]=dp[i-1]。
在到达第n-1个台阶之后,再多走一次(1步)就到底第n个台阶。

同理,一次只能走1~2个台阶,到达第n个台阶的方案实际上就是到达第n-1与n-2个台阶的方案的和,即dp[i]=dp[i-1]+dp[i-2]
在到达第n-1个台阶之后,再多走一次(1步)就到达第n个台阶;在到达第n-2个台阶之后,再多走一次(2步)就到达第n个台阶。

以n=4为例,
dp[1]=1;
dp[2]=2;
dp[3]=dp[1]+dp[2]=3;
dp[4]=dp[2]+dp[3]=2+3=5;

补充,此时整个dp数组就是斐波那契数列 https://www.cnblogs.com/hb-computer/articles/18562880

代码实现:

class Solution
{
public:
    int climbStairs(int n)
    {
        //0. 先处理特殊情况
        if (n == 1)
            return 1;
        if (n == 2)
            return 2;

        // 1. 确定dp数组以及含义 dp[i]表示台阶为i时需要花费的步数
        vector<int> dp(n + 1);

        // 2. 确定递推方程
        // dp[n]=dp[n-1]+dp[n-2]

        // 3. dp数组初始化
        // 最开始在第0台阶,到达第1台阶的方式只有1种(0->1),到达第2台阶的方式有2种(0->1->2;0->2)
        dp[0] = 0, dp[1] = 1, dp[2] = 2;

        // 4. 确定遍历顺序 :从前往后
        for (int i = 3; i <= n; i++)
        {
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        // 5. 打印(部分)dp数组以验证是否正确
        //  for(int i=1;i<dp.size();i++)
        //      cout<<dp[i]<<" ";

        return dp[n];
    }
};

时间复杂度

O(n)

posted @ 2024-11-23 17:17  HB_Computer  阅读(81)  评论(0)    收藏  举报