LeetCode 每日一题 [44] 斐波那契数列

LeetCode 斐波那契数列 [简单]

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof

示例 1:

输入:n = 2
输出:1

示例 2:

输入:n = 5
输出:5

提示:

0 <= n <= 100

题目分析
解法1

可以使用递归 但是可能会超时

解法2

可以使用迭代

解法3

可以使用动态规划 创建一个数组
注意:可能越界,也就是int的范围不够,所以需要进行处理、
大坑: 必须每次都进行取模运算,全部加了之后再取模就不通过

代码实现
public class Fib {
    public static void main(String[] args) {
        System.out.println(fib3(81));
        System.out.println(fib2(81));
        System.out.println(fib(81));
    }

    public static int fib3(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1 || n == 2) {
            return 1;
        }
        int[] res = new int[n + 1];
        res[0] = 0;
        res[1] = 1;
        for (int i = 2; i <= n; i++) {
            res[i] = (int) ((res[i - 1] + res[i - 2]) % (1e9 + 7));
        }
        return res[n];
    }

    public static int fib2(int n) {
        if (n <= 0) {
            return 0;
        }
        if (n == 1 || n == 2) {
            return 1;
        }
        // 1
        int one = 1;
        // 2
        int two = 1;
        int temp;
        for (int i = 3; i <= n; i++) {
            temp = two;
            one = (int) ((one + two) % (1e9 + 7));
            two = one;
            one = temp;
        }
        return two;
    }

    public static int fib(int n) {
        if (n <= 0) {
            return 0;
        }
        if (n == 1 || n == 2) {
            return 1;
        }
        return (int) ((fib(n - 1) + fib(n - 2)) % (1e9 + 7));
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容