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;
    }
}

运行结果:

相关推荐
清辞8534 分钟前
C++入门(底层知识C与C++的不同)
开发语言·c++·算法
~kiss~14 分钟前
图像处理~多尺度边缘检测算法
图像处理·算法·计算机视觉
Mr.看海30 分钟前
机器学习鼻祖级算法——使用SVM实现多分类及Python实现
算法·机器学习·支持向量机
.格子衫.1 小时前
018数据结构之队列——算法备赛
数据结构·算法
怎么没有名字注册了啊2 小时前
求一个矩阵中的鞍点
数据结构·算法
Greedy Alg2 小时前
LeetCode 74. 搜索二维矩阵
算法
小猪咪piggy2 小时前
【算法】day7 滑动窗口+二分查找
算法
仟千意3 小时前
数据结构:二叉树
数据结构·算法
一水鉴天3 小时前
整体设计 逻辑系统程序 之34七层网络的中台架构设计及链路对应讨论(含 CFR 规则与理 / 事代理界定)
人工智能·算法·公共逻辑
DuHz3 小时前
C程序中的数组与指针共生关系
linux·c语言·开发语言·嵌入式硬件·算法