leetcode_64 最小路径和

99 阅读1分钟

要求

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

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

示例 1:

image.png

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

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

核心代码

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        if not grid:
            return 0
        m = len(grid)
        n = len(grid[0])
        dp = [[0] * n] * m
        for i in range(m):
            for j in range(n):
                if not i and not j:
                    dp[i][j] = grid[i][j]
                elif not i and j:
                    dp[i][j] = dp[i][j-1] + grid[i][j]
                elif not j and i:
                    dp[i][j] = dp[i-1][j] + grid[i][j]
                else:
                    dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]
        return dp[m-1][n-1]

image.png

解题思路:动态规划,因为我们只能向右或者向下走,所以当我们的数据在第[0][0]的位置上的时候,直接赋值即可,在第一排的时候,我们向右走,只能从左侧的值加上现有的位置的值,在第一列的时候,我们向下走,只能从上面的值加上现有的位置的值,当不在原点、第一排、第一列的时候,我们可以从左侧向右走、或者从上向下走,取两者最小值加上现有位置的值即可。