剑指 Offer 10- I. 斐波那契数列
题目描述:
写一个函数,输入 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。
示例:
Input: n = 2
Output: 1
Input: n = 5
Output: 5
解题思路:
这是一道很典型的动态规划问题,虽然该题可以通过递归的方法得到最终答案,但是由于递归会将每个数重复的计算,这也就会导致当n特别大时,时间复杂度会非常的高。因此为了降低复杂度,我们可以采用存储的方式,将每个数都存储起来,这时候时间复杂度会降为O(n),但是因为需要额外的数组来存储,所以空间复杂度也会增加为O(n)。
我们可以注意到题目所说:斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 也就是说当我们只求斐波那契数列的第n项时,我们并不关心前面几项的数值究竟是多少,我们只关心n-1与n-2项的值,因此我们只需要使用常量来存储前两项的值与当前值,并且在每个循环中进行替换赋值。
算法代码:
class Solution {
public int fib(int n) {
if(n==0) return 0; // 初始化0,1的斐波那契数列值。
if(n==1) return 1;
int a = 0, b = 1;
int sum=0;
for(int i = 2; i<=n; i++){
sum = (a+b)% 1000000007;
a = b; // a 为 当前n-2项,b 为 n-1 项,进行赋值是因为在下一个循环中,b为n-2项。
b = sum; // sum 在下一个循环 为 n-1 项
}
return sum;
}
}
如有错误,欢迎大家留言指出,大家一起进步