Leetcode 64 最小路径和

题目传送门

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

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

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

分析:
使用DFS会超时,考虑动态规划
状态转移方程: v[ i ][ j ] = min( v[ i ][ j-1 ], v[ i-1 ][ j ] ) + gird[ i ][ j ]
其中和grid尺寸相同的矩阵v 用来记录到达gird[ i ][ j ]的最小路径和,
由于只能向下或者向右移动,到达grid[ i ][ j ]位置的最小值,必然是取
v[ i ][ j -1 ] (从左边到来) 和 v[ i-1 ][ j ] (从上方到来) 中的最小者 加上grid[ i ][ j ] 依次更新完v[ i ][ j ]即可获得到达左下角的最小路径和。
其中对于最上方一行 和最左边一列 我们需要单独考虑

Python3代码:

class Solution:
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        v = [[ 0 for col in range(len(grid[0]))] for row in range(len(grid))]
        v[0][0] = grid[0][0]

        for i in range(len(grid)):
            for j in range(len(gird[0])):
                if i == 0 and j == 0:
                    v[i][j] = grid[i][j]
                elif i == 0 :
                    v[i][j] = v[i][j-1] + grid[i][j]
                elif j == 0 :
                    v[i][j] = v[i-1][j] + grid[i][j]
                else:
                    v[i][j] = min(v[i][j-1], v[i-1][j]) + grid[i][j]
        return v[-1][-1]

你可能感兴趣的:(Leetcode 64 最小路径和)