2022跟着leedcode学数据结构--第23天

122 阅读1分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

image.png

动态规划一直都是一个难点,最近有空刚好刷刷看看

[斐波那契数]

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

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

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

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

 

示例 1:

输入:n = 2

输出:1

解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3

输出:2

解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4

输出:3

解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

0 <= n <= 30

解题思路:

  • 动态规划是解决具有重叠子问题的特殊分治
  • 根据以上思路查看当前题是符合动态规划的。
  • 定义dp数组
  • 先将补充dp数据 赋值n+1个0占位
  • 判断特殊情况 0 1 2 这三个位,0 的时候dp[0] == 0 dp[1] = 1 dp[2] =1
  • 之后运算公式dp[i]=dp[i-1]+dp[i-2]
  • db[-1]即为我们要的值
class Solution:
    def fib(self, n: int) -> int:
        if n == 0:
            return 0
        if n == 1 or n==2:
            return 1 
        dp = [0] * (n+1)
        for i in range(0, n+1):
            if i == 0:
                dp[i] = 0
            elif i == 1 or i == 2:
                dp[i] = 1 
            else:
                dp[i] = dp[i-1] + dp[i-2]
        return dp[-1]

执行结果:

image.png

[第 N 个泰波那契数]

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

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

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

 

示例 1:

输入:n = 4 输出:4 解释: T_3 = 0 + 1 + 1 = 2 T_4 = 1 + 1 + 2 = 4 示例 2:

输入:n = 25 输出:1389537  

提示:

0 <= n <= 37 答案保证是一个 32 位整数,即 answer <= 2^31 - 1。

解题思路:

  • 几乎和上一题思路一样,同样使用动态规划方法
  • 先初始化dp数组
  • 遍历数组,判断特殊情况row ==0 row ==1 row ==2
  • 其他情况根据计算方程式dp[row] = dp[row-1]+dp[row-2]+dp[row-3] 进行依次计算
  • 最后获取dp[-1] 获取最后一个值就是我们想要的结果了
class Solution:
    def tribonacci(self, n: int) -> int:
        dp=[0 for row in range(n+1)]
        for row in range(0,n+1):
            if row == 0:
                dp[0] = 0 
            elif row == 1 or row ==2:
                dp[row] =1
            else:
                dp[row] = dp[row-1]+dp[row-2]+dp[row-3]
        return dp[-1]

执行结果:

image.png