原始题目:剑指 Offer 10- I. 斐波那契数列 (opens new window)
# 方法一:递归法
根据定义时去进行递归。
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
1
2
2
直接递归在 比较大的时候,运算会特别慢,甚至崩溃。
# 方法二:动态规划
因为斐波那契数列中 等于前两个数字相加(),而且本题不需要列出 以前的所有数字,所以可以用两个数字记录某个数字的前两位,不断迭代相加。
代码:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
复杂度分析
时间复杂度:计算 需要循环 次,每轮的操作是 。
空间复杂度:几个标志变量占用常用大小的空间。