LeetCode算法动态规划—斐波那契数列

目录

[剑指 Offer 10- I. 斐波那契数列 - 力扣(LeetCode)](#剑指 Offer 10- I. 斐波那契数列 - 力扣(LeetCode))

题解:

代码:

运行结果:


写一个函数,输入 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. 首先定义一个常量 MOD,其值为 1000000007,用于对斐波那契数取模。
  2. 如果 n 小于 2,直接返回 n,因为在斐波那契数列中,前两个数字是 0 和 1。
  3. 初始化三个整数变量 p, q, r 分别为 0, 0, 1。p 用于保存上一个斐波那契数,q 用于保存当前斐波那契数,r 用于保存下一个斐波那契数。
  4. 使用循环从 2 开始到 n,每次更新 p, q, r 的值。将 q 的值赋给 p,将 r 的值赋给 q,然后计算新的 r 值为 (p + q) % MOD。
  5. 循环结束后,返回最终结果 r,即第 n 个斐波那契数。

通过滚动数组的思想,这段代码只需要常量级别的额外空间,而不会随着 n 的增大而增加额外的空间消耗,大大提高了代码的效率。

代码:

java 复制代码
class Solution {
    public int fib(int n) {
        final int MOD = 1000000007;
        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) % MOD;
        }
        return r;
    }
}

运行结果:

相关推荐
修修修也23 分钟前
【算法手记7】拼三角
数据结构·学习·算法·刷题
奋进的小暄36 分钟前
贪心算法(12))(java)坏了的计算器
java·算法·贪心算法
Hello bugyan1 小时前
线段树——>建树build,区间查询query,单点更新adddate,区间更新update,懒标记
数据结构·算法
『₣λ¥√≈üĐ』2 小时前
用“断舍离”整理你的数据:Lasso回归解读
笔记·学习·算法
fei_sun3 小时前
【数据结构】next数组、nextval数组
算法
今晚打老虎4 小时前
c++第三课(基础c)
c语言·c++·算法
武帝为此4 小时前
【C语言中联合体(共用体)详解】
c语言·算法
小百小摆5 小时前
Acwing6118 蛋糕游戏
数据结构·c++·算法
pipip.5 小时前
BFS解决----多源最短路径问题
算法·宽度优先
Tryagein7 小时前
【数据结构】并查集
数据结构·算法