题目:爬楼梯,每次可以选择爬1层或者2层,现在有n层楼梯,求总共有多少种爬楼梯的方法
思路:根据题目意思我们得到M(n)= M(n-1)+M(n-2),
- 如果当前选择爬1层,则剩下的n-1层有M(n-1)种爬法
- 如果当前选择爬2层,则剩下的n-2层有M(n-2)爬法
很容易知道这是斐波拉契数列
难度:Easy
代码:利用递归求解
public class Solution {
public int climbStairs(int n) {
return helper(n);
}
private int helper(int n){
if(n == 0 || n == 1 || n == 2){
return n;
}
return helper(n-1) + helper(n-2);
}
}
结果:运行超时,会重复递归计算很多
- 代码:利用一个数组来存储已经计算过的值(o(n)的空间复杂度和时间复杂度)
public class Solution {
public int climbStairs(int n) {
if(n == 0 || n == 1){
return n;
}
int[] result = new int[n+1];
result[0] = 1;
result[1] = 1;
for(int i = 2; i < n+1; i++){
result[i] = result[i-1] + result[i-2];
}
return result[n];
}
}
结果:Accepted