[路飞]_程序员必刷力扣题: 剑指 Offer 10- I. 斐波那契数列

85 阅读2分钟

剑指 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。

示例 1:

输入: n = 2
输出: 1

示例 2:

输入: n = 5
输出: 5

提示:

  • 链表中节点的数目在范围 [0, 1000]
  • 0 <= Node.val <= 1000
  • 1 <= k <= 50

递归

思路

我们知道斐波那契数列的规则就是

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2)

所以往后的第n位的值就等于前两位值之和,即n-1和n-2位置上的两数之和

这里我们可以直接用递归暴力破解,

  • 首先判断边界条件0和1的位置上面,我们直接返回
  • 其它位置上的值我们可以再次调用fib方法请求fib(n-1)和fib(n-2)的和
var fib = function (n) {
    if(n===0) return 0
    if(n===1) return 1
    return fib(n-1)+fib(n-2)
};

动态规划

思路

动态规划来做这道题效率跟高一些,一起看一下吧

因为我们每次计算都是前两个值相加得到,所以我们可以用两个变量p和q来保存。

为了方便计算,我们再声明一个当前变量curr,表示当前位置上的值。

  • 边界条件:就是在0位置上直接返回0,在1位置上直接返回1
  • 接下来n至少从2开始了,所以我们设置index为2
  • 只要index还不===n那么就不断循环,每次我们获取到当前curr的值为(p+q)%1000000007 取余,然后p = q;q=curr;接着让index++

那么到最后刚好index===n的时候,此时curr就是n位上的值,直接返回curr

var fib = function (n) {
    var m = 1000000007
    var p = 0
    var q = 1
    var curr
    if(n===0) return 0
    if(n===1) return 1
    var index = 2
    while (index <= n) {
        curr = (p+q) % m
        p = q
        q = curr
        index++
    }
    return curr
};