题目如下:
这是一个动态规划的题目,首先要提取出递推式:
f(1) = 1
f(2) = 2
f(n) = f(n-1) +f(n-2), n>2
接下来有多种方法:
1.递归
2.动态规划(滚动数组)
3.矩阵快速幂
4.通项公式法
1.递归法
int climbStairs(int n){
if(n == 1) return 1;
if(n == 2) return 2;
return climbStairs(n-1) + climbStairs(n-2);
}
简洁,方便写,但是开销大,在本题中被n=45的情况卡了脖子,超出时间限制。
2.动态规划
int climbStairs(int n){
if(n == 1) return 1;
if(n == 2) return 2;
int a = 1, b = 2, c = 0;
for(int i = 2; i < n; ++i){
c = a + b;
a = b;
b = c;
}
return c;
}
使用a,b,c滚动前进,开销小,时间复杂度为O(n),空间复杂度为O(1),效果很好
3.矩阵快速幂
这个有待实践
4.通项公式法
额,就是推公式