题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)n≤39n\leq39n≤39。
解决思路
- 递归,f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)=f(n−1)+f(n−2),自上而下求解并回溯到根节点,是一颗完全二叉树,所以时间复杂度O(2n2^n2n);空间复杂度为递归栈的大小,所以是O(n)。
- 迭代(动态规划):自下而上求解,记录下中间值,dp[0]=0,dp[1]=1,dp[2]=dp[1]+dp[0]…这样迭代到dp[n]即为所得解,时间复杂度O(n),空间复杂度O(n)。因为每轮迭代只和三个元素相关,我们可以用2个变量不断更新来替代数组,first=0,sum=1,sum=sum+first,first=sum-first…,优化后空间复杂度为O(1)。
Java实现
public class Solution {
public int Fibonacci(int n) {
//迭代法,数组记录中间值
// int[] res = new int[40];
// res[0]=0;
// res[1]=1;
// for(int i=2;i<=n;i++){
// res[i]=res[i-1]+res[i-2];
// }
// return res[n];
//直接用两个变量更新中间值
int first = 0, sum = 1;
for (int i = 2; i <= n; i++) {
sum += first;
first = sum - first;
}
return n == 0 ? first : sum;
}
}