/**
* @author Tom Qian
* @email tomqianmaple@outlook.com
* @github https://github.com/bluemapleman
* @date 2017年8月10日
*/
//一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
//思路: 首先穷举一下到达最后一级台阶的情况,分析最后到达是一步还是两步。
//新加一级台阶,要么用之前的方法JumpFloor(n-1)跳到n-1阶,再跳一次-JumpFloor(n-1)种
//要么用之前方法JumpFloor(n-2)跳到倒数第二阶,再一次跳两步-JumpFloor(n-2)种
//变相的斐波那契数列
public class 跳台阶
{
public static int JumpFloor(int target) {
//递归的结束条件。一般是手工得到最简单的几种情况的解作为返回值。
if(target==0)
return 0;
if(target==1)
return 1;
if(target==2)
return 2;
return JumpFloor(target-1)+JumpFloor(target-2);
}
// 1
// 11,2
// 111,12,21,3
// 1111,121,211,112,13,31,22,4
// 11111,1112,1121,1211,2111,113,131,311,14,41,5,23,32,122,212,221
// 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
public int JumpFloorII(int target) {
if(target==0)
return 0;
if(target==1)
return 1;
if(target==2)
return 2;
//穷举:分析最后到达是几步。
//新加一级台阶,要么用之前的方法JumpFloor(n-1)跳到n-1阶,再跳一次-JumpFloor(n-1)种
//要么用之前方法JumpFloor(n-2)跳到倒数第二阶,再一次跳两步-JumpFloor(n-2)种
//要么用之前方法JumpFloor(n-3)跳到倒数第三阶,再一次跳三步-JumpFloor(n-3)种
// 要么用之前方法JumpFloor(n-3)跳到倒数第四阶,再一次跳四步-JumpFloor(n-4)种
// ..。。。。。。。.
// 要么用之前方法JumpFloor(1)跳到第1阶,再一次跳n-1步-JumpFloor(1)种
// 要么一步到顶JumpFloor(0)
//变相斐波那契数列
int result=0;
for(int i=1;i<target;i++){
result+=JumpFloorII(i);
}
result+=1;
return result;
}
}
剑指Offer——跳台阶
最新推荐文章于 2019-07-02 11:38:53 发布