描述
自己想到的解法: 递归实现
public class Solution {
public int Fibonacci(int n) {
if(n==1||n==2){
return 1;
}else{ // n>2
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
}
- 优点,代码简单好写
- 缺点:慢,数字太大会超时
- 时间复杂度:O(2^n)
- 空间复杂度:递归栈的空间
拿求f[5] 举例:
通过图会发现,方法一中,存在很多重复计算.
解法二:循环实现
public class Solution {
public int Fibonacci(int n) {
// 第n-1个数
int preNum=1;
// 第n-2个数
int prePreNum=0;
int result=0;
if(n==0)
return 0;
if(n==1)
return 1;
for(int i=2;i<=n;i++){
// f(result)= f(n-1)+ f(n-2) n=2
result=preNum+prePreNum; // f(2)=f(1)+f(0) =1+0=1
// 交换
prePreNum=preNum; // f(0)=f(1)=1;
preNum=result; // f(1)=f(2)=1;
}
return result;
}
}
解法三:动态规划
int Fibonacci(int n ) {
int num[n+1];
num[0] = 0;
num[1] = 1;
for(int i=2; i<=n; i++)
{
num[i] = num[i-1] + num[i-2];
}
return num[n];
}