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
题解
这道题应该是一道水题,可是没做过的话,不明白背后的数学推导就有点难了。这道题的数学推导是什么呢
-
一阶,只有一种爬法,就是爬一步
-
二阶,有两种爬法
- 1+1,先爬一步,在爬一步
- 2,直接爬两步
-
三阶,有三种爬法
- 1+1+1,一步一步爬
- 1+2,先怕一步,再爬两步
- 2+1,先怕两步,再爬一步
-
四阶,有五种爬法
- 1、1+1+2
- 2、2+2
- 3、1+1+1+1
- 4、1+2+1
- 5、2+1+1
这里可能看不出规律,但是分析就可以得到规律,因为只有两种步伐,一步或两步,那只能在两阶或者三阶的基础上走。如果在两阶基础上,有上面的第一种(1+1+2)和第二种(2+2);如果在三阶的基础上,有第三种(1+1+1+1),第四种(1+2+1)和第五种(2+1+1).到此我们其实可以总结出规律,就是f(n)=f(n-1)+f(n-2),因为相差一步就是f(n-1)的爬法,相差两步就是f(n-2)的爬法。
-
n阶,f(n)=f(n-1)+f(n-2)
所以这里就可以得出公式
- n=1,f(n)=1
- n=2,f(n)=2
- n>=3,f(n)=f(n-1)+f(n-2)
class Solution {
int[] ans = new int[46];//打表数组
public int climbStairs(int n) {
init();//初始化
return ans[n];
}
void init(){//初始化函数
ans[1] = 1;//n=1
ans[2] = 2;//n=2
for(int i = 3; i <= 45; i++){//n>=3
ans[i] = ans[i-1] + ans[i-2];
}
}
}