LeetCode-剑指 Offer 10- I. 斐波那契数列

135 阅读1分钟

1.题目描述

写一个函数,输入 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 <= n <= 100

Tips: 力扣地址:leetcode-cn.com/problems/fe…

2. 思路分析

题干中给出了斐波那契数列的定义,也就是数列的规律。首先看到的就是这个规律和函数的递归很想。首先考虑的是使用递归解决。但是在代码的测试过程中发现会出现时间超出限制的情况。但是这个方程仔细一看是不是和动态规划的状态转移方程式很像。这里就相当于给你列好了方程式只需要根据方程式进行编码就可以了。这个题目其实也可以看成是找规律。

3. AC代码

//递归--时间超出限制
class Solution {
    public int fib(int n) {
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        return fib(n-1)%1000000007 + fib(n-2)%1000000007;
    }
}

class Solution {
    public int fib(int n) {
        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) % 1000000007;
        }
        return r;
    }
}

运行结果:

image.png

4. 总结

这个题目其实很简单,只需要根据方程式写代码就可以了。还省略了自己去写状态转移方程。

我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢