Leetcode-每日一题【剑指 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 <= n <= 100

解题思路

1.题目要求我们求斐波那契(Fibonacci)数列的第 n 项和,还给出了递归公式,那我们想到的第一种方法可能就是递归,像这样。

java 复制代码
class Solution {
    public int fib(int n) {
        if(n <= 1){
            return n;
        }
        return fib(n - 1) + fib(n - 2);

    }
}

但是这种方法会超出时间限制,因为它做了很多重复的工作

相同元素的f(n),每当我们在用到的时候就会将其重新算一遍,所以这种方法会超出时间限制。

2.那么我们还有没有优化的方法呢?当时是有的,我们可以新建一个数组在对应下标的位置存储一下对应f(n)的值,这样我们只需要计算一次,下次在用到时可以直接从数组中拿取。

3.首先我们新建一个数组,将其中的值都初始化为 -1,然后新建一个f(n)函数去进行运算,如果 n <= 1 的我们可以直接返回n,否则我们需要去数组中查找下标为n时的arr[n]是否为 -1,若为 -1 则说明我们还没有计算,我们就需要进行计算 f(n - 1) + f(n - 2) ,题目要求我们需要取模不要忘记了,然后将计算出的结果存放在数组相应的位置以便下次使用,最后返回计算结果即可。

代码实现

java 复制代码
class Solution {
    int[] arr;
    public int fib(int n) {
        arr = new int[n+1];
       for(int i = 0; i <= n; i++){
           arr[i] = -1;
       }
       return f(n);

    }
    public int f(int n){
        if(n <= 1){
            return n;
        }
        if(arr[n] != -1){
            return arr[n];
        }
        int sum = (f(n - 1) + f(n - 2)) % 1000000007;
        arr[n] = sum;
        return sum;
    }
}

测试结果

相关推荐
Good_Starry5 小时前
Java——正则表达式
java·开发语言·正则表达式
Xの哲學5 小时前
Linux io_uring 深度剖析: 重新定义高性能I/O的架构革命
linux·服务器·网络·算法·边缘计算
萤丰信息5 小时前
开启园区“生命体”时代——智慧园区系统,定义未来的办公与生活
java·大数据·运维·数据库·人工智能·生活·智慧园区
comli_cn5 小时前
残差链接(Residual Connection)
人工智能·算法
欧洵.5 小时前
Java.基于UDP协议的核心内容
java·开发语言·udp
xunyan62345 小时前
第九章 JAVA常用类
java·开发语言
Aaron15885 小时前
基于VU13P在人工智能高速接口传输上的应用浅析
人工智能·算法·fpga开发·硬件架构·信息与通信·信号处理·基带工程
予枫的编程笔记5 小时前
【论文解读】DLF:以语言为核心的多模态情感分析新范式 (AAAI 2025)
人工智能·python·算法·机器学习
im_AMBER5 小时前
Leetcode 99 删除排序链表中的重复元素 | 合并两个链表
数据结构·笔记·学习·算法·leetcode·链表
China_Yanhy5 小时前
AWS S3 深度配置指南:每一栏每个选项有什么作用
java·数据库·aws