原始题目:剑指 Offer 10- I. 斐波那契数列 (opens new window)

# 方法一:递归法

根据定义时去进行递归。

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
1
2

直接递归在 NN 比较大的时候,运算会特别慢,甚至崩溃。

# 方法二:动态规划

因为斐波那契数列中 F(N)F(N) 等于前两个数字相加(N>1N>1),而且本题不需要列出 NN 以前的所有数字,所以可以用两个数字记录某个数字的前两位,不断迭代相加。

代码:

class Solution {
    public int fib(int n) {
        if (n == 0 || n == 1) {
            return n;
        }
        int a = 0;
        int b = 1;
        int sum = 0;
        while (--n > 0) {
            sum = (a + b) % 1000000007;
            a = b;
            b = sum;
        }
        return sum;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

复杂度分析

  • 时间复杂度O(N)O(N):计算 f(N)f(N) 需要循环 NN 次,每轮的操作是 O(1)O(1)

  • 空间复杂度O(1)O(1):几个标志变量占用常用大小的空间。

上次更新: 2023/10/15