爬楼梯问题抽象出来就是斐波那契数列求和,
像这样递推公式,第一时间想到就是用递归
普通树形递归
一提交就爆栈,当n过大时压不住
case 10: result = 89;
case 20: result = 10946;
case 45: result = 1836311903;
class Solution {
public:
int climbStairs(int n) {
return f(n);
}
int f(int n){
if (n==2) return 2;
if (n==1) return 1;
return f(n-1)+f(n-2);
}
};
循环
空间复杂度O(1)
class Solution {
public:
int climbStairs(int n) {
if (n<=2) return n;
int x[n+1];
x[1]=1;
x[2]=2;
for(int i=3;i<=n;i++){
x[i]=x[i-1]+x[i-2];
}
return x[n]; }
};
先看一下线形递归
class Solution {
public:
int climbStairs(int n) {
return f(n,1,1);
}
int f(int n,int a,int b){
if(n==1) return 1;
return a+f(n-1,b,a+b);
}
};
尾递归
空间复杂度O(1)
class Solution {
public:
int climbStairs(int n) {
return f(n,1,1);
}
int f(int n,int a,int b){
if(n==1) return a;
// int Sum_last=a+b;
// int Sum_llast=b;
return f(n-1,a+b,a);
}
};