动态规划01-斐波那契类型一

斐波那契类型一

  • [1. 斐波那契数](#1. 斐波那契数)
  • [2. 爬楼梯](#2. 爬楼梯)
  • [3. 第n个泰波那契数](#3. 第n个泰波那契数)

1. 斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

真题点击此处:509.斐波那契数

解题方法:动态规划

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

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

以下为代码实现:

python 复制代码
class Solution:
    def fib(self, n: int) -> int:
        if n<2:
          return n
        
        p,q,r=0,0,1
        for i in range(2,n+1):
          p=q
          q=r
          r=p+q
        return r

其实我们也可以不用特判当n<2的情况,我们可以思考一下,斐波那契的数列为0,1,1,2,3,5......,我们不妨就用两个变量p,q分别为0,1,然后对于第n个数来说,我们循环n-1次,然后里面分别将p,q赋值为q,p+q。最后返回p就好了,以下为代码实现:

python 复制代码
class Solution:
    def fib(self, n: int) -> int:
        p,q=0,1
        for i in range(n):
            p,q=q,p+q
        return p

时间复杂度:O(n),只进行了一次循环遍历。

空间复杂度:O(1),只使用了常量级的额外空间。

2. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

真题点击此处:70.爬楼梯

解题方法:动态规划

思路:这题的思路跟上题的斐波那契数列的思路是一样的,都能得到以下递推关系:F(n)=F(n−1)+F(n−2),唯一的不同就是关于边界值的问题,斐波那契的前两个数的值是0,1,而爬楼梯的前两个数的值是1,2。所以实现方法也是和斐波那契数列非常相似的。

以下为代码实现:

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        p,q,r=0,0,1
        for i in range(n):
            p=q
            q=r
            r=p+q
        return r

以下为跟上题斐波那契数列第二种解法类似的代码。具体解释就不再说了,思想都是一样的。

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        p,q=0,1
        for i in range(n):
            p,q=q,p+q
        return q

时间复杂度:O(n),只进行了一次循环遍历。

空间复杂度:O(1),只使用了常量级的额外空间。

3. 第n个泰波那契数

泰波那契序列 Tn 定义如下:

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

真题点击此处:1137.第n个泰波那契数

解题方法:动态规划

思路:这题跟斐波那契数列的解法是很像的,只不过一个是前两个数相加,一个是前三个数相加而已。具体思路为:

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

T(n)=T(n-1)+T(n-2)+T(n-3)

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

以下为代码实现:

python 复制代码
class Solution:
    def tribonacci(self, n: int) -> int:
        if n == 0:
          return 0

        if n <= 2:
          return 1

        p, q, r = 0, 1, 1
        for i in range(3, n+1):
          s = p + q + r
          p, q, r = q, r, s

        return s 

同样的,我们还是可以不用特判当n<=2的时候的情况,以下为代码实现:

python 复制代码
class Solution:
    def tribonacci(self, n: int) -> int:
        p,q,r=0,1,1
        for i in range(n):
            p,q,r=q,r,p+q+r
            print(p,q,r)
        return p

时间复杂度:O(n),只进行了一次循环遍历。

空间复杂度:O(1),只使用了常量级的额外空间。

相关推荐
花开富贵ii2 小时前
代码随想录算法训练营四十九天|图论part07
java·数据结构·算法·图论·prim·kruscal
CoovallyAIHub2 小时前
无需ReID网络!FastTracker凭借几何与场景认知实现多目标跟踪新SOTA,助力智慧交通更轻更快
深度学习·算法·计算机视觉
CoovallyAIHub2 小时前
D‘RespNeT无人机图像分割数据集与YOLOv8-DRN模型,实时识别入口与障碍,助力灾后救援
深度学习·算法·计算机视觉
小白程序员成长日记3 小时前
8.26学习日志
学习·算法·leetcode
汤永红4 小时前
week5-[字符数组]查找
c++·算法·信睡奥赛
林内克思4 小时前
inline内联函数
java·开发语言·算法
源代码•宸4 小时前
Leetcode—1163. 按字典序排在最后的子串【困难】
经验分享·算法·leetcode·双指针
天选之女wow7 小时前
【LeetCode】动态规划——542.01 矩阵
leetcode·矩阵·动态规划
GIS小天10 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月25日第170弹
人工智能·算法·机器学习·彩票
PAK向日葵11 小时前
【算法导论】XM 0823 笔试题解
算法·面试