原题链接
https://leetcode.com/problems/unique-paths/
https://leetcode.com/problems/unique-paths-ii/
https://leetcode.com/problems/minimum-path-sum/
解题思路
这三道题比较类似,都是利用动态规划。
其中,unique path只需要把走到每一个格子里的方法数目加和即可;
unique path II 是一个简单变体,把obstaclegrid中为1的格子的方法数设置为0,再按照同上方法加和;
minimum path sum取上面和左边格子中的较小值与给定格子中的加数相加得到当前的最小和。
代码
unique path
class Solution():
def uniquePaths(self, m, n):
methods = [[1 for i in range(n)] for i in range(m)]
for right in range(1, m):
for down in range(1, n):
methods[right][down] = methods[right-1][down] + methods[right][down-1]
return methods[m-1][n-1]
unique path II
class Solution(object):
def uniquePathsWithObstacles(self, obstacleGrid):
"""
:type obstacleGrid: List[List[int]]
:rtype: int
"""
num_row = len(obstacleGrid) + 1
num_col = len(obstacleGrid[0]) + 1
expand_grid = [[0 for i in range(num_col)] for i in range(num_row)]
for row in range(1, num_row):
for col in range(1, num_col):
if obstacleGrid[row-1][col-1]==1:
expand_grid[row][col] = 0
elif row==1 and col==1:
expand_grid[row][col] = 1
else:
expand_grid[row][col] = expand_grid[row][col-1] + expand_grid[row-1][col]
return expand_grid[num_row-1][num_col-1]
minimum path sum
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
num_row = len(grid) + 1
num_col = len(grid[0]) + 1
sum_grid = [[0 for i in range(num_col)] for i in range(num_row)]
for row in range(1, num_row):
for col in range(1, num_col):
if row==1:
sum_grid[row][col] = sum_grid[row][col-1] + grid[row-1][col-1]
elif col==1:
sum_grid[row][col] = sum_grid[row-1][col] + grid[row-1][col-1]
else:
sum_grid[row][col] = min(sum_grid[row-1][col], sum_grid[row][col-1]) + grid[row-1][col-1]
return sum_grid[num_row-1][num_col-1]