面试题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];
}

快手公司福利 1244人发布
查看22道真题和解析