####下面贴出五种解法:####
首先简单递推可知
一级 1 种
二级 2 种
三级 3 种
四级 5 种
五级 8 种
N级 (N-1)的走法数+(N-2)的走法和
/**
* 递归算法 一行 时间复制度O(2^(N/2))~O(2^N) 空间复杂度O(N)
*/
public int fib02(int n){
return n==1||n==2?n:fib02(n-1)+fib02(n-2);
}
/**
* 备忘录法 时间复制度O(N) 空间复杂度O(N)
*/
public int fib03(int n){
if(n==1||n==2){
return n;
}else{
int[] array=new int[n+1];
array[1]=1;
array[2]=2;
return dfs(n, array);
}
}
public int dfs(int n,int[] array){
if(array[n]!=0){
return array[n];
}else{
array[n]=dfs(n-1, array)+dfs(n-2, array);
return array[n];
}
}
/**
* 动态规划法 时间复制度O(N) 空间复杂度O(N)
*/
public int fib04(int n){
if(n==1||n==2){
return n;
}else{
int[] array=new int[n+1];
array[1]=1;
array[2]=2;
for(int i=3;i<=n;i++){
array[i]=array[i-1]+array[i-2];
}
return array[n];
}
}
/**
* 滚动数组 时间复制度O(N) 空间复杂度O(1)
*/
public int fib05(int n){
if(n==1||n==2){
return n;
}else{
int a=1;
int b=2;
int t;
for(int i=3;i<=n;i++){
t=a+b;
a=b;
b=t;
}
return b;
}
}
/**
* 通项公式法 时间复制度O(Log2N) 空间复杂度O(1)
*/
public int fib06(int n){
if(n==1||n==2){
return n;
}else{
double sqrtFive=Math.sqrt(5);
n++;
double a=Math.pow((1+sqrtFive)/2, n);
double b=Math.pow((1-sqrtFive)/2, n);
double result=1/sqrtFive*(a-b);
return (int) Math.floor(result);
}
}
备忘录法:采用递归方式,值计算出来之后将其保存起来以备它用。
动态规划法:常用于满足最优子结构f(n) =
f(n-1)+f(n-2),存在重叠子问题。
滚动数组法:优化空间,需要保存数值不多的情况下使用