跳台阶
时间限制:1秒
空间限制:32768K
本题知识点:递归
题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
public class Solution {
public int JumpFloor(int target) {
}
}
分析:
当 n = 1 时,只有一种跳法 f(1)=1
当 n = 2 时,有两种跳法 f(2)=2
当 n >= 3 时,由于第一次跳的情况只有两种 1步/2步,后序跳的对应的是 f(n-1)/f(n-2)
此时对于 f(n),有 f(n) = f(n-1)+f(n-2)
由上述分析可知该题所求是斐波那契数列。
解法一:
/**
* 简单递归求解
*/
public class Solution {
public int JumpFloor(int target) {
if(target <= 0) return 0;
if(target == 1) return 1;
if(target == 2) return 2;
// 对于 target >= 3 的情况
return JumpFloor(target-1) + JumpFloor(target-2);
}
}
解法二:
/**
* 分析知道了所求为斐波那契数列 f(n) = f(n-1) + f(n-2)
* 对递归求解的思路进行优化:
* 动态维护 i=f(n-2)+f(n-1) 和 j=f(n-1)+f(n) 两个值,最后返回 i
*/
public class Solution {
public int JumpFloor(int target) {
if(target <= 0) return 0;
int i = 1;
int j = 2;
int tmp;
/*
* 当 target = 1,不执行 while, 返回 i=1 {i=f(1)=1,j=f(2)=2}
* 当 target = 2,执行1遍 while,返回 i=2 {i=f(2)=2,j=f(1)+f(2)=3}
* 当 target = 3,执行2遍 while,返回 i=3 (i=f(1)+f(2)=3,j=f(2)+f(3)=5)
* ......
* 当 target = n,执行(n-1)遍 while,返回 i {i=f(n-2)+f(n-1),j=f(n-1)+f(n)}
*/
while((--target)>0){
tmp = j;
j += i;
i = tmp;
}
return i;
}
}