1. 题目
青蛙每次可以跳一个台阶或者两个台阶,问跳上n个台阶有多少种跳法
2. 思路
自顶向下思考:
假如是10层台阶,那么我们只需要知道跳上9层台阶和8层台阶各有多少种跳法,
要知道跳上9层台阶有多少种跳法,我们只需要知道跳上8层台阶和7层台阶有多少种跳法,
要知道跳上8层台阶有多少种跳法,我们只需要知道跳上7层台阶和6层台阶有多少种跳法,
依次类推...
跳上第2层台阶有2种跳法
跳上第1层台阶有1种跳法
递归树:
自底向上思考:
跳上第1层台阶有1种跳法,跳上第2层台阶有2种跳法
跳上第3层台阶有f(2)+f(1)种跳法
...
其实就是个
3. 代码
递归
public int climbStairs(int n) {
int res = 0;
if(n == 0 || n == 1){
return 1;
}
res += climbStairs(n-1) + climbStairs(n-2);
return res;
}
记忆化搜索
HashMap<Integer,Integer> hm = new HashMap();
public int climbStairs(int n) {
int res = 0;
if(n == 0 || n == 1)
return 1;
//检查当前节点n有没有被计算过
//如果当前节点没有被计算过,就计算当前节点,然后放到HashMap中
if(!hm.containsKey(n)){
res += climbStairs(n-1) + climbStairs(n-2);
hm.put(n,res);
}else{//否则,直接从HashMap中取出来返回就可以了
return hm.get(n);
}
return res;
}
循环
public int climbStairs(int n) {
int res = 0;
if(n == 1){
return 1;
}
int p = 1; //0
int q = 1; //1
for(int i = 2 ; i <= n; i++){
res = p + q;
p = q;
q = res;
}
return res;
}
斐波那契数列
代码
public int fib( int n ){
if( n == 0 )
return 0;
if( n == 1 )
return 1;
return fib(n-1) + fib(n-2);
}
执行过程