方法一: 递归实现,代码简洁,但是效率较低
public class Solution {
public int Fibonacci(int n) {if(n<1)
{
return 0;
}
if( n <=2)
{
return 1;
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
方法二:循环实现,提高效率
public class Solution {
public int Fibonacci(int n) {
if(n<1)
{
return 0;
}
if( n ==1)
{
return 1;
}
int fm1 = 1;
int fm2 = 0;
int fn = 0;
for(int i =2;i <= n ;i++)
{
fn = fm1+fm2;
fm2 = fm1;
fm1 = fn;
}
return fn;
}
}
问题变形:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。同样满足f(n)=f(n-1)+f(n-2)的关系,但是没有febonacci数列的第一项,即febonacci数列:1,1,2,3,5,8,13......;而青蛙跳台阶是:1,2,3,5,8........
public class Solution {
public int JumpFloor(int target) {
if(target == 1)
{
return 1;
}
if(target == 2)
{
return 2;
}
int tn2 = 1;
int tn1 = 2;
int tn = 0;
for(int i =3; i<= target ;i++)
{
tn = tn2+ tn1;
tn2= tn1;
tn1= tn;
}
return tn;
}
}
变态跳:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
可以认为青蛙在任意一级台阶都有落脚和不落脚两种选择,最后一级台阶必须落脚,因此结果就是2*2*2.....=2^(n-1)
public class Solution {
public int JumpFloorII(int target) {
if(target == 0)
{
return 0;
}
return (int)Math.pow(2,target-1);
}
}
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
同样满足f(n)=f(n-1)+f(n-2)的关系, 也是 1,2,3,5,8........
public class Solution {
public int RectCover(int target) {
if(target == 0)
{
return 0;
}
if(target == 1)
{
return 1;
}
int fnm1 = 1;
int fnm2 = 1;
int fn = 2;
for(int i =2;i<=target;i++)
{
fn = fnm1+fnm2;
fnm2 = fnm1;
fnm1 = fn;
}
return fn;
}
}