题目链接
题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
题目示例
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
3. 1 阶 + 1 阶 + 1 阶
4. 1 阶 + 2 阶
5. 2 阶 + 1 阶
题目提示
- 1 <= n <= 45
题目思路
假设n是1,那么有1种方法可以爬到楼顶
(1)
假设n是2,那么有2种方法可以爬到楼顶
(1,1)(2)
假设n是3,那么有3种方法可以爬到楼顶
(1,1,1)(1,2)(2,1)
假设n是4,那么有5种方法可以爬到楼顶
(1,1,1,1,)(1,1,2,)(1,2,1)(2,1,1)(2,2)
假设n是5,那么有8种方法可以爬到楼顶
(1,1,1,1,1)(1,1,1,2)(1,1,2,1)(1,2,1,1)(2,1,1,1)
(1,2,2)(2,1,2)(2,2,1)
通过枚举找规律,不难发现,第i个数等于(i - 1) + (i - 2)
这是因为我们要想达到第i层,有两种走法——从第i - 1层走1层上来,或者从i - 2层走两层上来,因此第i层的走法是这两层的走法的总和
有了这个结论,就不难写代码了
代码——递归实现
class Solution{
public int climbStairs(int n) {
if(n <= 1){
return 1;
}
return climbStairs(n - 1) + climbStairs(n - 2);
}
}
但是,使用递归实现时,当我们计算climbStairs(5)时,就往下递归计算了climbStairs(4),climbStairs(3),climbStairs(2),climbStairs(1),这些值
而计算climbStairs(4)时,还是需要计算climbStairs(3),climbStairs(2),climbStairs(1)这些值
可以发现,我们重复计算的值非常多,因此如果n特别大,不仅会算的特别慢,而且可能出现栈溢出
因此,我们可以使用另外一种方法实现
代码——迭代实现
class Solution {
public int climbStairs(int n) {
int prev = 0;
int cur = 0;
int next = 1;
for (int i = 1; i <= n; i++) {
prev = cur;
cur = next;
next = prev + cur;
}
return next;
}
}