爬楼梯 Climbing-Stairs
题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
题目说明如下
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
[!NOTE] Given n will be a positive integer.
Example 1:
Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
Example 2:
Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
思路&题解
爬楼梯的流程类似于排列组合,如从5个球里面选2个有几种选法。N阶楼梯,爬上和爬下的方法数是一样。 对N阶,我们先走第一步,如果走一级,只需要考虑剩下n-1级的走法,如果走两级,只需考虑剩下n-2级的走法,
- S(n) = S(n-1)+S(n-2)
- S(2) = 2
- S(1) = 1
- S(0) = 0
结合这个思路,可以得到
public int climbStairs(int n) {
if(n==0){
return 0;
} else if(n==1){
return 1;
} else if(n==2){
return 2;
} else {
return climbStairs(n-1)+climbStairs(n-2);
}
}
如果直接提交这个算法,可能会失败,因为效率比较低,存在大量的递归重复计算
提交时间 | 状态 | 执行用时 | 内存消耗 | 语言 |
---|---|---|---|---|
7 分钟前 | 通过 | 0 ms | 32.1 MB | java |
8 分钟前 | 通过 | 0 ms | 31.7 MB | java |
21 分钟前 | 超出时间限制 | N/A | N/A | java |
尝试缓存S(n)的结果,方便递归时直接复用已经计算过的阶梯数:
int[] cache;
public int climbStairs(int n) {
if (cache==null){
cache = new int[n+1];
}
if(n==0){
return 0;
} else if(n==1){
return 1;
} else if(n==2){
return 2;
} else {
if(cache[n-1]<=0){
cache[n-1] = climbStairs(n-1);
}
if(cache[n-2]<=0){
cache[n-2]=climbStairs(n-2);
}
cache[n]= cache[n-1]+cache[n-2];
return cache[n];
}
}