这是一道比较经典的算法题,这里有两种跳法,其他许多的算法题思想都和这道题类似
一、 一只青蛙一次可以跳上1级台阶,也可以跳上2级。
求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)
//方式一: 使用递归解决
public int JumpMethod(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 2;
}
return JumpMethod(n-1)+JumpMethod(n-2);
}
//方式二:因为方式一中递归会存在大量重复计算值的情形,所以可以设置一个hash表,进行值的存储,
// 如下次遇到相等的值直接取出,降低时间复杂度
public int JumpMethodPlus(int n, HashMap<Integer,Integer> map) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
//如果hash表中包含某个跳的台阶数,对应的值就是跳的方法数,则取出改value
if (map.containsKey(n)) {
return map.get(n);
} else {
int value = JumpMethodPlus(n - 1, map) + JumpMethodPlus(n - 2, map);
//把计算出的value值放入hash表中
map.put(n, value);
return value;
}
}
//方式三:自底向上,使用迭代,降低空间复杂度
public int JumpFloorPlus2(int n){
if(n<1){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 2;
}
int a=1;
int b=2;
int temp=0;
for(int i=3;i<n;i++){
temp=a+b;
a=b;
b=temp;
}
return temp;
二、 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法
/*
这个可以用数学来解释
F(n) = F(n-1)+F(n-2)+...+F(1)
F(n-1) = F(n-2)+F(n-3)+...+F(1)
两个式子相减,很容易得出F(n)=2F(n-1)
*/
public int JumpMethod2(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 2;
}
return 2*JumpMethod2(n-1);
}