题目:
给定一个包含非负整数的
m x n
网格grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。
来源:力扣(LeetCode)
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
示例:
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:输入:grid = [[1,2,3],[4,5,6]]
输出:12
解法:
创建m行n列的表格,m、n和grid保持一致,第1行初始化为grid第1行从左往右递加。第1列初始化为grid第1列从上往下递加。
遍历表格右下区域(去除第1行、列),每个值=grid对应位置值+表格上方和左边中的最小值。因为当前位置只能从上方或左方走过来,所以取其中最小值。
代码:
class Solution: def minPathSum(self, grid: List[List[int]]) -> int: m = len(grid) n = len(grid[0]) f = [[0] * n for _ in range(m)] for index in range(n): f[0][index] = grid[0][index] if index == 0 else f[0][index - 1] + grid[0][index] for index in range(m): f[index][0] = grid[index][0] if index == 0 else f[index - 1][0] + grid[index][0] for i in range(1, m): for j in range(1, n): f[i][j] = min(f[i - 1][j], f[i][j - 1]) + grid[i][j] return f[m - 1][n - 1]