[递归+暂存] 力扣 70. 爬楼梯

假设你正在爬楼梯。需要 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

题解

递归

使用递归解题,在递归函数solve中,传入left:剩余梯子数目,判断

  • left==1,则直接返回1,因为一个梯子就一种方法
  • left==2,返回2,有两种方法
  • 其他情况返回solve(left-1)+solve(left-2):当前梯子数分别采用走一步和走两步得到的方法之和

可是仅这样会超时,如何改进呢?仅返回solve(left-1)+solve(left-2)的话,有的部分会重复计算,

如一开始n=5,5-1=4,5-2=3,4-1=3,...,当left为3时计算了两次

所以可以采用一个数组t去存每个梯子数组对应的方法数量,在返回的时候查表即可

代码
class Solution {
private:
int t[46]={0};//记录n个提数的方法
public:
    int solve(int left){//left:剩余梯子数量
        if(left==1)
            return 1;
        if(left==2)
            return 2;
        if(t[left-1]==0)//记录left-1
            t[left-1]=solve(left-1);
        if(t[left-2]==0)//记录
            t[left-2]=solve(left-2);
        return t[left-1]+t[left-2];//查表
    }
    int climbStairs(int n) {
        return solve(n);
    }
};

动态规划

查看代码
 class Solution {
public:
    int climbStairs(int n) {
        int dp[n+1];
        
        dp[0] = 0;
        dp[1] = 1;
        if (n==1)
            return dp[n];
        dp[2] = 2;
        for(int i = 3;i <= n;++i){
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};

 

posted @ 2022-05-31 19:45  付玬熙  阅读(26)  评论(0编辑  收藏  举报