题目描述
斐波那契数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)。现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
题目分析
由于给出了递推公式,很容易想到采用递归的方式求解,下面给出代码:
public class Solution {
public int Fibonacci(int n) {
return computer(n);
}
public int computer(int n) {
if(n == 0 || n == 1) {
return n;
}
return computer(n-1)+computer(n-2);
}
}
但是这种方式重复计算太多,时间复杂度为2的n次方(这里相当于一颗二叉树,树的总结点数时2的n次方),遇到很大的数字就运算超时,我们可以考虑使用Map把中间结果保存下来进行优化。时间复杂度为o(n)
class Solution {
Map<Integer,Integer> map;
public int fib(int n) {
map = new HashMap<>();
return computer(n);
}
public int computer(int n) {
if(n == 0 || n == 1) {
return n;
}
if(map.get(n) != null) {
return map.get(n);
} else {
int num1 = computer(n-1);
int num2 = computer(n-2);
map.put(n,num1+num2);
return num1+num2;
}
}
}
第二种方式,采用迭代的方式。时间复杂度为o(n)
class Solution {
public int fib(int n) {
if(n == 0 || n == 1) {
return n;
}
int num1 = 0;
int num2 = 1;
int i = 2;
while(i<=n) {
int temp = num1+num2;
num1 = num2;
num2 = temp;
i++;
}
return num2;
}
}