青蛙跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题目分析
- 青蛙每次可以跳任意阶台阶,只要不超过给定的台阶总数即可。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4fea7a7992a17cca0237f220f77a3a84.png)
- 如图所示,存在1个台阶时,只有一种方法。
- 当存在2个台阶时,如果青蛙第一次跳1个台阶,剩下1个台阶,图片左侧就包含了1个台阶的所有情况,只有一种方法;如果青蛙第一次跳2个台阶,只有一种方法;一共两种方法。
- 当存在3个台阶时,如果青蛙第一次跳1个台阶,剩下2个台阶,图片中间就包含了2个台阶的所有情况,只有两种方法;如果青蛙第一次跳2个台阶,剩下1个台阶,图片左侧就包含了1个台阶的所有情况,只有一种方法;如果青蛙第一次跳3个台阶,只有一种方法:一共四种方法。
- 所以可以推出1个台阶只有1种跳法,2个台阶只有2种跳法,3个台阶有4种跳法,4个台阶有8种跳法,5个台阶有16种跳法……
- 也即是:f(1)=1,f(2)=f(1)+1,f(3)=f(2)+f(1)+1,……,f(n)=f(n-1)+f(n-2)+…+f(1)+1。我们可以用f(0)=1来代替式中的1,即f(1)=f(0),f(2)=f(1)+f(0),f(3)=f(2)+f(1)+f(0),……,f(n)=f(n-1)+f(n-2)+…+f(1)+f(0)。
public class Solution {
public int jumpFloorII(int target) {
if(target < 0){
return 0;
}
else if(target <= 2){
return target;
}
else{
int result[] = new int[target+1];
result[0] = 1;
result[1] = 1;
for(int i = 2;i <= target;i++)
for(int j = 0;j < i;j++)
result[i] += result[j];
return result[target];
}
}
}
- 经过观察,可以发现,每多一个台阶,方法数就会翻一倍,也就是f(2)=2f(1),f(3)=2f(2),……,f(n)=2f(n-1)。
public class Solution {
public int jumpFloorII(int target) {
if(target < 0){
return 0;
}
else if(target <= 2){
return target;
}
else{
int result[] = new int[target+1];
result[0] = 1;
result[1] = 1;
for(int i = 2;i <= target;i++)
for(int j = 0;j < i;j++)
result[i] += result[j];
return result[target];
}
}
}
- 再仔细观察一下可以发现,台阶的个数似乎与方法数有某种指数关系,f(n)=2n-1
public class Solution {
public int jumpFloorII(int target) {
if(target <= 0){
return 0;
}
else{
return new Double(Math.pow(2,target-1)).intValue();
}
}
}