leetcode-70.爬楼梯

动态规划(dp)


题目详情

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


示例1:

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

示例2:

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

思路:
斐波那契数列题。定义一个数组 dp,dp[i] 表示走到第 i 阶的方法数。因为我们每次可以走一步或者两步,所以第 i 阶可以从第 i-1 或 i-2 阶到达。换句话说,走到第 i 阶的方法数即为走到第 i-1 阶的方法数加上走到第 i-2 阶的方法数。这样我们就得到了状态转移方程dp[i] = dp[i-1] + dp[i-2]。注意边界条件的处理。

我的代码:

class Solution 
{
public:
    int climbStairs(int n) 
    {
        if (n <= 2) return n;
        vector<int> dp(n+1, 1);
        for (int i = 2; i <= n; ++i)
        {
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};

可以看出,我们利用了vector存储了各个状态,但是状态只有1和2两种,显然O(n)空间复杂度太过繁杂,我们可以用两个变量来存储状态,从而得到下面代码:

class Solution 
{
public:
    int climbStairs(int n) 
    {
        if (n <= 2) return n;
        int pre2 = 1, pre1 = 2, cur; //pre2 pre1 cur实质就是dp[i-2] dp[i-1] dp[i]
        for (int i = 2; i < n; ++i) //注意这里变为 < 号了,因为如果是 = 号,最后
        {                           //return的cur就会多计算一次
           cur = pre1 + pre2;
           pre2 = pre1;
           pre1 = cur;
        }
        return cur;
    }
};

涉及知识点:

1.动态规划(dp)

动态规划

posted @ 2022-04-16 17:17  ggaoda  阅读(1)  评论(0编辑  收藏  举报  来源