14. leetCode-剑指Offer10-I斐波那契数列

剑指Offer10-I斐波那契数列

1. 问题描述

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

    F(0) = 0,   F(1) = 1
    F(N) = F(N - 1) + F(N - 2), 其中 N > 1
    
  2. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

  3. 示例 1:

    输入:n = 2
    输出:1
    
  4. 示例 2:

    输入:n = 5
    输出:5
    
  5. 提示:

    0 <= n <= 100
    

2. 代码实现

斐波那契数列的定义是 f(n + 1) = f(n) + f(n - 1) ,生成第 n项的做法有以下几种:

  1. 递归法:

    1. 原理: 把 f(n)f(n) 问题的计算拆分成 f(n-1)和 f(n-2)两个子问题的计算,并递归,以 f(0)和 f(1)为终止条件。
    2. 缺点: 大量重复的递归计算,例如 f(n)和 f(n - 1)两者向下递归需要各自计算 f(n - 2)的值。
  2. 动态规划:
    2. 原理: 以斐波那契数列性质 f(n + 1) = f(n) + f(n - 1) 为转移方程。
    3. 从计算效率、空间复杂度上看,动态规划是本题的最佳解法。

作者:jyd

2.1 方法一

递归法,超出时间限制;哈哈哈哈哈

class Solution {
    public int fib(int n) {
       if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }
}

动态规划,使用质数1000000007取余

class Solution {
    public int fib(int n) {
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        // 这里n+2 是为了防止数组下标越界
        int[] arr = new int[n+2];
        arr[0] = 0;
        arr[1] = 1;

        // 具体的逻辑
        for(int i=2;i<=n;i++){
            arr[i] = arr[i-1] + arr[i-2];
            arr[i] %= 1000000007;
        }

        return arr[n];
    }
}
2.2 方法二

动态规划

class Solution {
    public int fib(int n) {
       int a = 0;
        int b =1;
        int sum;
        for (int i = 0; i < n; i++) {
            sum = (a + b) % 1000000007;
            // 后移一步
            a = b;
            b = sum;
        }
        return a;

    }
}

3. 结果分析

方法一:

  1. 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
  2. 内存消耗:36.7 MB, 在所有 Java 提交中击败了7.12%的用户

方法二:

  1. 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
  2. 内存消耗:36.5 MB, 在所有 Java 提交中击败了45.27%的用户

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值