思路一:递归
把握终止条件及递归公式
public class Solution {
public int Fibonacci(int n) {
if(n==0 || n==1)
return n;
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
复杂度
时间O(2^N-1) 即2^n
空间 递归栈大小 O(N)
思路二:迭代
public class Solution {
public int Fibonacci(int n) {
int arr[]=new int[n+1];
if(n==0 || n==1)
return n;
arr[0]=0;
arr[1]=1;
for(int i=2;i<arr.length;i++)
{
arr[i]=arr[i-1]+arr[i-2];
}
return arr[n];
}
}
复杂度
时间O(N)
空间O(N)
方式三:对递归的优化,解决重复计算的问题,我们发现右边存在大量的重复计算,使用哈希表优化结构
import java.util.HashMap;
public class Solution {
HashMap<Integer,Integer> map = new HashMap<>();
public int Fibonacci(int n) {
if(n==0 || n==1)
return n;
if(map.containsKey(n))
return map.get(n);
else
{
int val = Fibonacci(n-1)+Fibonacci(n-2);
map.put(n,val);
return val;
}
}
}
复杂度
时间O(N)
空间O(N)
方式四:动态规划,待定