第八题:跳台阶与变态跳台阶
1.跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解析:根据题意,我们可以举例说明并从中找到数学规律。列举出台阶数与跳法,可得出规律类似斐波那契数列。
当然我们也可以推导出来,前提是该青蛙只能有两种跳法,一次跳一个台阶,一次跳两个台阶,那么假设我们第一次跳1个台阶,那么剩下台阶的跳法为 f(n-1),如果我们第一次跳2个台阶,那么剩下台阶的跳法为f(n-2),当剩下2个台阶时,结果为f(2) = 2,当剩下1个台阶时,结果为f(1) = 1,结论为:
| 1,(n=1)
f(n) = | 2,(n=2)
| f(n-1)+f(n-2),(n>2)
具体实现代码如下:
public class Solution { //最优解
public int Fibonacci(int n) {
if(n <= 2){ //代码的鲁棒性
return n;
}
int first = 1;
int second = 2;
int result = 0;
for(int i = 3;i < n+1;i++){
result = first + second;
first = second;
second = result;
}
return result;
}
}
2.变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解析:有n级台阶,第一步的跳法有n种,可以一次跳一级,跳二级.....跳n级
跳1级,剩下的n-1级跳法为:f(n-1)
跳2级,剩下的n-1级跳法为:f(n-2)
得出: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);
下面代码为递归解法和非递归解法
第三种是一个非常牛逼的解,借鉴其他人的解释为: 每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后一个台阶必须跳。所以共用2^(n-1)中情况
具体实现代码如下:
/**
*〈一句话功能简述〉<br>
*〈变态跳台阶〉
*/
public class JumpFloorII {
/**
* 功能描述: <br>
*〈递归写法〉
*/
public int method1(int target){
if (target <= 0){
return -1;
}
if (target == 1){
return 1;
}else {
return 2*method1(target - 1);
}
}
/**
* 功能描述: <br>
*〈非递归写法〉
*/
public int method2(int target){
int count = 1;
while (--target > 0){
count *= 2;
}
return count;
}
/**
* 功能描述: <br>
*〈牛逼解法〉
*/
public int method3(int target){
return 1 << --target;
}
}