问题描述
大家都知道斐波那契数列[ f(n)=0,n=0;f(n)=1,n=1;f(n)=f(n-1)+f(n-2),n>1 ],现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39
解题思路
看到这道题的第一眼,往往想到的是用递归算法去解,但是递归算法是非常慢的,因为重复的计算太多。以求f(10)为例,下图是用树表示的依赖关系,树中很多结点是重复的,而且重复的结点数会随着n的增大而急剧增加。
方法:从下往上计算,首先根据f(1)和f(0)计算出f(2),再根据f(2)和f(1)计算出f(3)......以此类推便可计算出第n项。这种算法的时间复杂度是O(n)
代码
public class Solution { public int Fibonacci(int n) { if(n<2) return n; int fibNMinusOne = 0; int fibNMinusTwo =1; int fibN = 0; for(int i=2;i<=n;i++){ fibN = fibNMinusOne+fibNMinusTwo; fibNMinusOne = fibNMinusTwo; fibNMinusTwo = fibN; } return fibN; } }