https://leetcode.com/problems/minimum-path-sum/
Medium
问题描述: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Example:
1 2 3 4 5 6 7 8 Input: [ [1,3,1], [1,5,1], [4,2,1] ] Output: 7 Explanation: Because the path 1→3→1→1→1 minimizes the sum.
思路及代码: 这一题給定了一个附带权值的grid
,左上角为起点,右下角为终点,每次向下或者向右走,要求寻找一条权值之和最小的路径,并返回最小权值和。
我们可以通过一个二维数组dp[i][j]
来保存从起点到[i,j]
位置的最小权值和,状态转移方程如下:
1 dp[i][j] = min (grid[i][j] + dp[i-1 ][j], grid[i][j] + dp[i][j-1 ])
最后我们返回dp[-1][-1]
即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution : def minPathSum (self, grid: List[List[int ]] ) -> int: row = len (grid) column = len (grid[0 ]) dp = [[0 ] * column for _ in range (row)] print(grid[-1 ][0 ]) for i in range (row): for j in range (column): if i == 0 and j == 0 : dp[i][j] = grid[i][j] elif i == 0 : dp[i][j] = grid[i][j] + dp[i][j - 1 ] elif j == 0 : dp[i][j] = grid[i][j] + dp[i - 1 ][j] else : dp[i][j] = min (grid[i][j] + dp[i][j - 1 ], grid[i][j] + dp[i - 1 ][j]) return dp[row - 1 ][column - 1 ]
这一题可以直接在题目给定的grid
上修改,从而降低空间复杂度,同时,对第一列和第一行单独处理:
1 2 3 4 5 6 7 8 9 10 11 def minPathSum (self, grid ): m = len (grid) n = len (grid[0 ]) for i in range (1 , n): grid[0 ][i] += grid[0 ][i - 1 ] for i in range (1 , m): grid[i][0 ] += grid[i - 1 ][0 ] 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 ]