leetcode-Minimum Path Sum

Minimum Path Sum

题意:

  给定一个方格,每个格子中有一个数字,现在我们要找一条从方格左上角出发直到方格右下角的路,条件是这条路经过的数字之和为最小。

 

解题思路:

  此题仍然是动态规划类型的问题,关键是我们如何将这个问题划分为多个类似阶段。

  目前的想法是可不可以先找到小方格内的最小路径,然后在去利用当前的结果去找比他大的方格的最小路径。如果是这样的话,大方格的最小路径一定会路过小方格最小路径吗?(一定会到达小方格的左上角吗?)这一点还不能确定。

  从刚才的想法我衍生出来另一种方法,首先我们观察我们每一步影响到的方块数,我们会发现随着路径长度的增加,我们是以阶梯形状向上推进的(假设我们从右下方往左上方找)。像这样:

OOO   OOO   OOX   OXX   XXX

OOO > OOX > OXX > XXX > XXX

OOX   OXX   XXX   XXX   XXX

  依照动态规划的思想,在每个阶段,我们可以将打叉的区域的方格数字标记为从右下角出发到达当前方格的最短路径长度。层层递增,那么有当前 

matrix[i][j] = min(matrix[i-1][j], matrix[i][j-1])

  假设我们有一个矩阵如下:

S50

160

43E

  那么首先我们先更新矩阵右下角两条边的最短路径,然后在依次往上更新矩阵:

S5   S5   S50   (S+5)50

16 > 190 > 890 >   8  90

73   73E   73E     7  3E

  于是程序我们就可写成:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
    # @param {integer[][]} grid
    # @return {integer}
    def minPathSum(self, grid):
        m = len(grid)
        n = len(grid[0])
        for i in range(1,m):
            grid[i][0] += grid[i-1][0]
        for j in range(1,n):
            grid[0][j] += grid[0][j-1]
        for i in range(1,m):
            for j in range(1,n):
                grid[i][j] += min(grid[i-1][j], grid[i][j-1])
        return grid[-1][-1]

 

posted @   Xander-Hang  阅读(614)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示