Fibonnacci算法

题目需求:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

  • 示例 1:
    输入:n = 2
    输出:1
  • 示例 2:
    输入:n = 5
    输出:5

以下使用Java的方法,时间复杂度优选100%,内存占用比较多,不是特别推荐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int fib(int n) {
final int MOD=1000000007;
if(n<2){
return n;
}
int p=0,q=0,r=1;
for(int i=2;i<=n;++i)
{
p=q;
q=r;
r=(p+q)%MOD;
}
return r;
}
}

以下是使用Goland的方法去实现,如果要时间和内存占用的最优解,可以使用go,可以完美解决此类问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
func fib(n int) int {
const mod int =1e9+7
if n < 2{
return n
}
q,p,r:=0,0,1
for i:=2;i<=n;i++ {
p=q
q=r
r=(q+p)%mod
}
return r
}

这道题,使用了动态数组来解决。我们可以推导出斐波那契数列具有规律性。比如
f(0)=0,f(1)=1
这是n<2的角度,所以优先一个if去判断,然后再下续
f2=f1+f0
f3=f2+f1
以此类推,我们可以交换数组进行加法运算,可以快速解决该类问题。虽然使用Java对内存占用要求高很多