每日一练(5):斐波那契数列

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

写一个函数,输入 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


来源:力扣(LeetCode)


链接:https://leetcode-cn.com/probl...


方法一:动态规划


算法流程:


斐波那契数的边界条件是 F(0) = 0 和 F(1) = 1。当 n > 1 时,每一项的和都等于前两项的和,因此有如下递推关系:


F(n) = F(n - 1) + F(n - 2)


由于斐波那契数存在递推关系,因此可以使用动态规划求解。动态规划的状态转移方程即为上述递推关系,边界条件为 F(0) 和 F(1)。


复杂度分析


  • 时间复杂度:O(n)
  • 空间复杂度:O(1)


int fib(int n) {
    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;
}


方法二:滑动窗口


public int fib(int n) {
    int MOD = 1000000007;
    int a = 0, b = 1;
    while (n > 0){
        b = a+b;
        a = b-a;
        --n;
        b %= MOD;
    }
    return a;
}
目录
相关文章
|
7月前
牛客刷题之数学基础-快速幂
牛客刷题之数学基础-快速幂
39 0
|
24天前
|
机器学习/深度学习 C语言
斐波那契数列(用c语言探索黄金分割之美)
斐波那契数列(用c语言探索黄金分割之美)
17 0
|
1月前
|
Java Go C++
C/C++每日一练(20230426) 不喜欢带钱的小C、数组排序、超级素数
C/C++每日一练(20230426) 不喜欢带钱的小C、数组排序、超级素数
40 0
C/C++每日一练(20230426) 不喜欢带钱的小C、数组排序、超级素数
|
7月前
|
Python
牛客刷题之数学基础-约数
牛客刷题之数学基础-约数
30 0
|
11月前
|
机器学习/深度学习 Java
每日一练之斐波那契的实现
每日一练之斐波那契的实现
66 0
|
存储
剑指Offer - 面试题10:斐波那契数列
剑指Offer - 面试题10:斐波那契数列
64 0
|
存储 C++
蓝桥杯练习题六 - 大数乘法(c++)
蓝桥杯练习题六 - 大数乘法(c++)
158 0
蓝桥杯练习题六 - 大数乘法(c++)
|
算法
算法题每日一练---第60天:快速幂
快速幂是一种简单而有效的小算法。
158 15
算法题每日一练---第60天:快速幂
|
算法 索引
LeetCode每日一练(杨辉三角)
LeetCode每日一练(杨辉三角)
143 0
LeetCode每日一练(杨辉三角)
|
算法
算法题每日一练---第65天:螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素
100 1
算法题每日一练---第65天:螺旋矩阵 II