剑指offer——跳台阶
问题描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路分析
当台阶为n=1,跳法f(n)=1;
当台阶为n=2,跳法f(n)=2; 方法(1,1)(2)
当台阶为n=3,跳法f(n)=3; 方法(1,1,1)(1,2)(2,1)
当台阶为n=4,跳法f(n)=5; 方法(1,1,1,1)(1,1,2)(1,2,1)(2,1,1)(2,2)
观察f(n)其实为斐波那契数列,所以
依次类推,可以递归求出n级阶梯跳法之和。f(n)=f(n-1)+f(n-2);
f
(
n
)
=
{
1
n
=
1
2
n
=
2
f
(
n
−
1
)
+
f
(
n
−
2
)
n
>
2
f(n) = \begin{cases} 1 & n=1 \\ 2 & n= 2 \\ f(n-1)+f(n-2) & n>2 \end{cases}
f(n)=⎩⎪⎨⎪⎧12f(n−1)+f(n−2)n=1n=2n>2
解法一 :直接用公式,但是效率低。
public class Solution {
public int JumpFloor(int target) {
if(target<=0){
return 0;
}
if(target==1||target==2){
return target;
}
return JumpFloor(target-1)+JumpFloor(target-2);
}
}
解法二:把已经得到的数列的中间项保存下来。下次计算的时候先查找。
代码
public class Solution {
public int JumpFloor(int target) {
int result[]={0,1,2};
if(target<3){
return result[target];
}
int Jump_NMinusOne=2;
int Jump_NMinusTwo=1;
int Jump_N=0;
for(int i=3;i<=target;i++){
Jump_N=Jump_NMinusOne+Jump_NMinusTwo;
Jump_NMinusTwo=Jump_NMinusOne;
Jump_NMinusOne=Jump_N;
}
return Jump_N;
}
}