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

往期内容在这里:

往期01-05

往期06-10

往期11-15

往期16-20

数组篇01

数组篇02

数组篇03

数组篇04

动态规划篇

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

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

leetcode原题:

题解为:

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

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

Leetcode原题:

 题解为:

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

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

Leetcode原题:

题解为:

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        # i为数组的行
        for i in range(len(grid)):
            # j为数组的列
            for j in range(len(grid[0])):
                # 判断当位于第一行
                if (i == 0 and j != 0):
                    # 所有的dp[i - 1][j] 都在第一行上边,出了数组上边界
                    grid[i][j] += grid[i][j - 1]
                # 判断当位于第一列
                elif (i != 0 and j == 0):
                    # 所有的 dp[i][j - 1] 都在第一列左边,出了数组左边界
                    grid[i][j] += grid[i - 1][j]
                # 当位于第一行第一列(i == 0 and j == 0)
                elif (i == 0 and j == 0):
                    continue
                # 位于数组里面某一位置
                else:
                    grid[i][j] += min(grid[i-1][j], grid[i][j-1])
        # 遍历完全部行和列之后,返回最后的值 dp[-1][-1]
        return grid[-1][-1]


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

Leetcode原题为:

题解为: 

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

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条小海龟

谢谢你的打赏,微臣会好好努力达

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值