Description
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:
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.
Solution
Similar the to the shortest path problem.
This is a typical DP problem. Suppose the minimum path sum of arriving at point (i, j)
is S[i][j]
, then the state equation is S[i][j] = min(S[i - 1][j], S[i][j - 1]) + grid[i][j]
.
To save space, the original grid can store the result of sum.
Bounday conditions are the first column and the first row.
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m = len(grid) # number of rows
n = len(grid[0]) # number of columns
# grid also stores the min sum.
# The first row
for i in range(1, n):
grid[0][i] += grid[0][i-1]
# The first column
for i in range(1, m):
grid[i][0] += grid[i-1][0]
# sum[i][j] = min(sum[i-1][j], sum[i][j-1]) + grid[i][j]
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] # return the right bottom most cell