一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
n = 1时,只有一种跳法
n = 2时,两种跳法
n>2时,第一步可能 跳1,2,3.....,n步
f(n) = f(n-1) + f(n-2) + ..... + f(1) + 1
public class Solution {
public int JumpFloorII(int target) {
if(target==1){
return 1;
}
if(target==2){
return 2;
}
int ret = 1;
while(target-1>=1){
ret += JumpFloorII(target-1);
target--;
}
return ret;
}
}
事实上,对于 f(n) = f(n-1) + f(n-2) + ..... + f(1) + 1
= 2* [ f(n-2) + f(n-3) + ... + f(1) + 1 ]
= 2*2 [ f(n-3) + ..... f(1) + 1]
= pow(2,n-2)*[ f(1) + 1]
= pow(2,n-1)
故,非常简单!!!
public class Solution {
public int JumpFloorII(int target) {
return (int) Math.pow(2,target-1);
}
}
可以看到,有些问题的代码很简单,但是分析的过程非常重要,算法最重要的不是代码,而是它的数学分析。
注:当然可以计算前几个台阶的跳法而找出规律,上面这个过程是严格的分析证明