LeetCode64-最小路径和

第一个星期的第一天

准备好好上班了

昨天查上学期的期末成绩

提心吊胆的一科终于是在老师浓浓的师生情下涉险过关了

开心

好好干活了


64-最小路径和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

输入:
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

这一题也是很典型的动态规划的题目了,还是那句老话,对动态规划算法不熟悉的朋友可以看看我之前写的一篇文章,相信会让你有所熟悉的。

https://blog.csdn.net/weixin_36431280/article/details/86616672

看完这篇文章,你会知道:其实解动态规划算法的核心步骤是找到相应的状态转移方程,而本题的状态转移方程就是下图所示:

 

转移方程出来了,代码写起来就很简单了。

代码如下:

class Solution:
    # 本题采用动态规划的算法
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        if len(grid) == 0:
            return 0
        grid_row_length, grid_col_length = len(grid), len(grid[0])
        # 定义一标记矩阵, 并初始化为全0矩阵
        flag_matrix = []
        for index in range(grid_row_length):
            flag_matrix.append([0]*grid_col_length)
        for row in range(grid_row_length):
            for col in range(grid_col_length):
                # 如果是第一行第一列元素,那么最短路径就是自身
                if row == 0 and col == 0:
                    flag_matrix[row][col] = grid[0][0]
                # 如果是第一行非第一列元素,那么最短路径就是从第一个元素到其自身
                elif row == 0 and col > 0:
                    flag_matrix[row][col] = flag_matrix[row][col-1] + grid[row][col]
                # 如果是第一列非第一行元素,那么最短路径就是从第一个元素到其自身
                elif row > 0 and col == 0:
                    flag_matrix[row][col] = flag_matrix[row-1][col] + grid[row][col]
                # 其他位置的元素所对应的最短路径和就是其上一行元素和其左一列元素所对应的最短路径和的最小值
                else:
                    flag_matrix[row][col] = min(flag_matrix[row-1][col], flag_matrix[row][col-1])+grid[row][col]
        return flag_matrix[grid_row_length-1][grid_col_length-1]


if __name__ == "__main__":
    grid = [[1, 3, 1], [1, 5, 1], [4, 2, 1]]
    min_route = Solution().minPathSum(grid)
    print(min_route)

执行效率还算可以,在70%左右

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学习的学习者

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值