当前位置:   article > 正文

200道大数据面试常考Leetcode算法题--动态规划进阶(与矩阵相关)篇(python带代码解析)_矩阵和 leetcode

矩阵和 leetcode

往期内容在这里:

往期01-05

往期06-10

往期11-15

往期16-20

数组篇01

数组篇02

数组篇03

数组篇04

动态规划篇

大家好,继续为大家推荐200道大数据面试常考Leetcode算法题,这期为--动态规划进阶(与矩阵相关)篇,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)这篇更新4篇,艾瑞巴迪和我一起刷起来!!

200道大数据面试常考Leetcode算法题(动态规划进阶(与矩阵相关)篇)62-不同路径

leetcode原题:

题解为:

  1. class Solution:
  2. def uniquePaths(self, m: int, n: int) -> int:
  3. # 定义一维空间,其大小为 n,值全是1
  4. dp = [1] * n
  5. for i in range(1, m):
  6. for j in range(1, n):
  7. # i行第j列位置的路径数量 =
  8. # 第i - 1行第j列位置的路径数量(上方值) + 第i行第j - 1列位置的路径数量(左边)
  9. dp[j] = dp[j] + dp[j - 1]
  10. # 返回最后一个的结果
  11. return dp[-1]

200道大数据面试常考Leetcode算法题(动态规划进阶(与矩阵相关)篇)63-不同路径Ⅱ

Leetcode原题:

 题解为:

  1. class Solution:
  2. def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
  3. width = len(obstacleGrid[0])
  4. dp = [0 for i in range(width)]
  5. dp[0] = 1
  6. # 自低向上循环
  7. for row in obstacleGrid:
  8. for j in range(width):
  9. # 左边的格子如果没有障碍物就是1,如果有障碍物则是0
  10. if row[j] == 1:
  11. dp[j] = 0
  12. # 当前格子走法 = 右边格子走法 + 下方格子走法
  13. elif j > 0:
  14. dp[j] += dp[j - 1]
  15. return dp[width - 1]

200道大数据面试常考Leetcode算法题(动态规划进阶(与矩阵相关)篇)64-最小路径和

Leetcode原题:

题解为:

  1. class Solution:
  2. def minPathSum(self, grid: List[List[int]]) -> int:
  3. # i为数组的行
  4. for i in range(len(grid)):
  5. # j为数组的列
  6. for j in range(len(grid[0])):
  7. # 判断当位于第一行
  8. if (i == 0 and j != 0):
  9. # 所有的dp[i - 1][j] 都在第一行上边,出了数组上边界
  10. grid[i][j] += grid[i][j - 1]
  11. # 判断当位于第一列
  12. elif (i != 0 and j == 0):
  13. # 所有的 dp[i][j - 1] 都在第一列左边,出了数组左边界
  14. grid[i][j] += grid[i - 1][j]
  15. # 当位于第一行第一列(i == 0 and j == 0
  16. elif (i == 0 and j == 0):
  17. continue
  18. # 位于数组里面某一位置
  19. else:
  20. grid[i][j] += min(grid[i-1][j], grid[i][j-1])
  21. # 遍历完全部行和列之后,返回最后的值 dp[-1][-1]
  22. return grid[-1][-1]

200道大数据面试常考Leetcode算法题(动态规划进阶(与矩阵相关)篇)221-最大正方形

Leetcode原题为:

题解为: 

  1. class Solution:
  2. def maximalSquare(self, matrix: List[List[str]]) -> int:
  3. # 定义边长
  4. r = 0
  5. row = len(matrix)#行
  6. col = len(matrix[0])#列
  7. for i in range(row):
  8. for j in range(col):
  9. matrix[i][j] = int(matrix[i][j])#转为数字好判断点
  10. if i and j and matrix[i][j]:
  11. #转移方程,依赖于左边,上面,左上面的最大边数,选择最小的一个边
  12. matrix[i][j] = min(matrix[i - 1][j], matrix[i][j-1], matrix[i-1][j-1]) + 1
  13. # 找到最大的边长
  14. r = max(r, matrix[i][j])
  15. #返回面积
  16. return r * r

好啦,这期的分享到这里结束啦!我们下期(动态规划在进阶(序列类动态规划问题)篇)再见!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/632994
推荐阅读
相关标签
  

闽ICP备14008679号