• 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) 。

    题解:

    一:按照递推公式使用动态规划,时间复杂度O(n),空间复杂度O(1)。

    1. class Solution(object):
    2. def fib(self, n):
    3. if n <= 1:
    4. return n
    5. pre, cur = 0, 1
    6. for _ in range(2, n + 1):
    7. cur, pre = cur + pre, cur
    8. return cur

     二:矩阵快速幂,时间复杂度O(lgn),空间复杂度O(1)

    1. class Solution(object):
    2. def fib(self, n):
    3. if n <= 1:
    4. return n
    5. mat = [[1, 1], [1, 0]]
    6. # 只要进行n-1次乘法,带特值,例如n=2,只需要一次乘法
    7. ans = self.matrix_pow(mat, n - 1)
    8. """
    9. [a, b [1,
    10. c, d] 0]
    11. 自然 a * 1 + b * 0 也即a就是答案
    12. """
    13. return ans[0][0]
    14. def matrix_pow(self, a, pow):
    15. # 单位矩阵
    16. ret = [[1, 0], [0, 1]]
    17. while pow > 0:
    18. if pow & 1:
    19. ret = self.matrix_multiply(ret, a)
    20. pow >>= 1
    21. a = self.matrix_multiply(a, a)
    22. return ret
    23. def matrix_multiply(self, a, b):
    24. # 特指shape=[2, 2]的矩阵乘法
    25. c = [[0, 0], [0, 0]]
    26. for i in range(2):
    27. for j in range(2):
    28. c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j]
    29. return c

    1137. 第 N 个泰波那契数 

    力扣

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

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

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

     和上题很像,一:按照递推公式用动态规划;二:矩阵快速幂

    1. class Solution(object):
    2. def tribonacci(self, n):
    3. if n <= 1:
    4. return n
    5. if n == 2:
    6. return 1
    7. mat = [[1, 1, 1], [1, 0, 0], [0, 1, 0]]
    8. # 只要进行n-2次乘法,带特值,例如n=3,只需要一次乘法
    9. ans = self.matrix_pow(mat, n - 2)
    10. """
    11. [a, b, c [1,
    12. d, d, e, 1,
    13. f, g, h] 0]
    14. 自然 a * 1 + b * 1 也即a + b就是答案
    15. """
    16. return ans[0][0] + ans[0][1]
    17. def matrix_pow(self, a, pow):
    18. # 单位矩阵
    19. ret = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    20. while pow > 0:
    21. if pow & 1:
    22. ret = self.matrix_multiply(ret, a)
    23. pow >>= 1
    24. a = self.matrix_multiply(a, a)
    25. return ret
    26. def matrix_multiply(self, a, b):
    27. # 特指shape=[3, 3]的矩阵乘法
    28. c = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    29. for i in range(3):
    30. for j in range(3):
    31. c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j] + a[i][2] * b[2][j]
    32. return c

  • 相关阅读:
    Rust : 与C交互动态库和静态库的尝试
    Java web速成之jsp
    动手强化学习(六):DQN 算法
    项目整个管理论文之2
    【有营养的算法笔记】快速排序
    typeScript常用类型(二)
    HCIP实验1-2:OSPF多区域
    未来可期!我国保健食品将迎来黄金时期
    MAUI+MASA Blazor 兼容性测试报告及分析
    JAVA多线程基础学习三:volatile关键字
  • 原文地址:https://blog.csdn.net/qq_xuanshuang/article/details/126102178