面试题10:斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39
掌握思路:原始递归算法效率太低,所以不予采用。我用的是时间复杂度为O(n)的一个算法:重点在while循环中,当n>=2时,按照已知f(n-1)、f(n-2)计算f(n),再将f(n),f(n-1)的值保存计算下一个值,就这样从下往上计算。
代码:
class Solution { public: int Fibonacci(int n) { int f[2]={0,1}; if(n==0) return f[0]; if(n==1) return f[1]; //从下往上计算。 int f_n0=f[0]; int f_n1=f[1]; int f_n2=0; if(n>1) { for(int i=2;i<=n;i++) { f_n2=f_n0+f_n1; f_n0=f_n1; f_n1=f_n2; } } return f_n2; } };
与上述代码一样的
发现计算f[5]的时候只用到了f[4]和f[3], 没有用到f[2]...f[0],所以保存f[2]..f[0]是浪费了空间。
只需要用3个变量即可。
int Fibonacci(int n) { if (n < 0) return -1; if (n == 0 || n == 1) return n; int a = 0,b = 1,c=0; int i = 2; while (i<=n) { c = a + b; a = b; b = c; ++i; } return c; }
差点意思但用的动态规划思想
int Fibonacci(int n) { if (n < 0) return -1; if (n == 0 || n == 1) return n; vector<int> fibo(n+1,0); fibo[0] = 0; fibo[1] = 1; int i = 2; while (i<=n) { fibo[i] = fibo[i - 1] + fibo[i - 2]; ++i; } return fibo[n]; }