题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数
分析这道题从基础开始,若是只有一层台阶那只有一种选择,因此f(n)=1,当有两层台阶时我们可以选择一步或两步,因此f(n)=2,当有三个台阶时呢,最后一步一定是从第二个台阶或第一个台阶迈过来,换句话说也就是,有三个台阶时,f(n)=f(1)+f(2),由此我们可以推导出f(n)=f(n-1)+f(n-2) (n>2)
因此可以采用递归的思想
java代码
class Solution {
public int climbStairs(int n){
if(n==1) f[n]=1;
else if(n==2) f[n]=2;
else{
f[n]=f[n-2]+f[n-1]
}
return f[n];
}
}
但是我们看一下递归树
递归树中2已经递归过了但是又递归了一遍,这是重复递归,优化它,我们采用递归+记忆的办法(这里有前提,子问题的相关性应该是循环的,否者我们将得到无限)我们采用一个memo数组去记录,若是已经递归了则不进行重复作业
java代码
class Solution {
public int climbStairs(int n) {
int memo[]= new int[n+1];
return climbStairsMemo(memo,n);
}
public int climbStairsMemo(int memo[],int n){
if(memo[n]>0) return memo[n];
if(n==1) memo[n]=1;
else if(n==2) memo[n]=2;
else{
memo[n]=climbStairsMemo(memo,n-1)+climbStairsMemo(memo,n-2);
}
return memo[n];
}
}