[递归+暂存] 力扣 70. 爬楼梯
作者:互联网
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);
}
};
标签:爬楼梯,int,力扣,solve,70,return,梯子,方法,left 来源: https://www.cnblogs.com/fudanxi/p/16332018.html