题目描述
思路分析
当阶数为 1 时 ,解法为 1
当阶数为 2 时 ,解法为 2
当阶数为 3 时 ,解法为 3
当阶数为 4 时 ,解法为 5
......
很明显可以分析出:一下公式:
代码实现:
- 递归法
class Solution {
public int climbStairs(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
return climbStairs(n-1) + climbStairs(n-2);
}
}
缺点:时间复杂度为O(n^2),存在重复计算,如下图:f(4) 和 f(3)
- 递归法(优化,解决重复计算问题)
class Solution {
//创建一个 map 专门存储 已计算的结果,防止重复计算
private Map<Integer,Integer> map = new HashMap<>();
public int climbStairs(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
//先从 map 中查找,如果能找到,就不使用递归来计算
if(null != map.get(n)){
return map.get(n);
}else{
int result = climbStairs(n-1) + climbStairs(n-2);
map.put(n,result);
return result;
}
}
}
- 循环法
class Solution {
public int climbStairs(int n) {
if(n == 1) return 1;
if(n == 2) return 2;
int result = 0;
int pre = 2;
int prePre = 1;
//由题目可知,n=1 => 1, n=2 => 2,所以从 n=3 开始
for(int i = 3;i <= n;i++){
result = pre + prePre;
prePre = pre;
pre = result;
}
return result;
}
}
运行结果展示