每日一练(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;
}
目录
相关文章
|
6月前
|
算法 Java Go
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
47 1
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
【剑指offer】-斐波那契数列-07/67
【剑指offer】-斐波那契数列-07/67
|
6月前
剑指Offer LeetCode 面试题10- I. 斐波那契数列
剑指Offer LeetCode 面试题10- I. 斐波那契数列
40 0
剑指offer-9.斐波那契数列
剑指offer-9.斐波那契数列
46 1
|
机器学习/深度学习 Java
每日一练之斐波那契的实现
每日一练之斐波那契的实现
86 0
|
存储
剑指Offer - 面试题10:斐波那契数列
剑指Offer - 面试题10:斐波那契数列
84 0
剑指offer 09. 斐波那契数列
剑指offer 09. 斐波那契数列
42 0
斐波那契数列(剑指offer 10-I)
斐波那契数列(剑指offer 10-I)
|
算法 索引
LeetCode每日一练(杨辉三角)
LeetCode每日一练(杨辉三角)
166 0
LeetCode每日一练(杨辉三角)
|
存储
LeetCode每日一练(两数之和)
LeetCode每日一练(两数之和)
141 0
LeetCode每日一练(两数之和)