写点什么

算法: 动态规划 - 斐波那契数列问题

作者:正向成长
  • 2022 年 5 月 04 日
  • 本文字数:1691 字

    阅读完需:约 6 分钟

算法:动态规划-斐波那契数列问题

斐波那契数列问题

LeetCode 509:斐波那契数 (通常用 F(n) 表示)形成的序列称为斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给定 n ,请计算 F(n) 该问题。

该问题可以通过以下几种方式进行解决:


  1. 递归实现

时间复杂度为,实现源码

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

我们在计算F(N)的时候前面已经计算过F(n-1)可以通过记忆F(n-1)来降低计算的复杂度。


  1. 动态规划

时间复杂度为O(N),空间复杂度为O(N)

int fib(int n) {        vector<int> dp = vector<int>(n+2);    dp[0] = 0, dp[1] = 1;    for (int i = 2; i <= n; i++) {        dp[i] = dp[i-1] + dp[i-2];    }    return dp[n];}
复制代码

只依赖可以进行空间压缩,利用滑动数组来降低空间复杂度。


  1. 动态规划+滑动数组

int fib(int n) {    if (n <= 1) return n;
int pre = 1, prepre = 0; int cur = 1; for (int i = 2; i <= n; i++) { cur = pre + prepre; prepre = pre; pre = cur; } return cur;}
复制代码
  1. 矩阵快速幂

时间复杂度为,空间复杂度为

快速幂算法可以快速计算的时间复杂度内计算得到结果。 快速幂算法源码较长,可以参考实现Github源码


  1. 通项公式

实现源码:

int fib(int n) {    double sqrt5 = sqrt(5);    double fibN = pow((1 + sqrt5) / 2, n) - pow((1 - sqrt5) / 2, n);    return round(fibN / sqrt5);}
复制代码


类似问题扩展

  1. 爬楼梯问题

LeetCode 70:爬楼梯问题 设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。 这就是一个斐波那契额数列问题,状态转移方程:F(n)=F(n-1)+F(n-2)F(n)=F(n−1)+F(n−2) 

快速幂等公式推导:

实现github源码


  1. 第 N 个泰波那契数

LeetCode1137 第 N 个泰波那契数 泰波那契序列 Tn 定义如下: T0=0, T1=1, T2=1, 且在 n>= 0 的条件下 Tn+3=Tn+Tn+1+Tn+2。给你整数 n,请返回第 n 个泰波那契数 Tn 的值


快速幂等公式推导:

动态规划和快速幂等实现github源码


发布于: 刚刚阅读数: 2
用户头像

正向成长

关注

正向成长 2018.08.06 加入

想要坚定地做大规模数据处理(流数据方向),希望结合结合批处理的传统处理方式,以及之后流批混合处理方向进行学习和记录。

评论

发布
暂无评论
算法:动态规划-斐波那契数列问题_动态规划_正向成长_InfoQ写作社区