62. 不同路径
dp重要的是找到和前一状态之间的关系
对于本题的路径,只能往右或者往下,那么对当前位置,可以由
- 上方的位置往下 或
- 左侧的位置往右
得到。
def uniquePaths(self, m: int, n: int) -> int:
# 生成m行n列dp数组
dp = [[1] * n for _ in range(m)]
for i in range(1,m):
for j in range(1, n):
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[-1][-1]
63. 不同路径 II
增加了障碍物的设置
初始化dp为1,对于障碍物及只能经障碍物到达的边界,赋值为1
dp状态的更新和原题类似
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m = len(obstacleGrid)
n = len(obstacleGrid[0])
# 注意初始化
dp = [[1] * n for _ in range(m)]
for i in range(m):
for j in range(n):
# obstacle, that is, no path
if obstacleGrid[i][j] == 1:
dp[i][j] = 0
else:
if i >= 1 and j >= 1:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
else:
# 配合初始化
if i >= 1 and dp[i-1][j] == 0:
dp[i][j] = 0
if j >= 1 and dp[i][j-1] == 0:
dp[i][j] = 0
return dp[-1][-1]
参考随想录给出的更清晰的赋值方式
dp = [[0 for _ in range(col)] for _ in range(row)]
dp[0][0] = 0 if obstacleGrid[0][0] == 1 else 1
if dp[0][0] == 0:
return 0 # 如果第一个格子就是障碍,return 0
# 第一行
for i in range(1, col):
if obstacleGrid[0][i] == 1:
# 遇到障碍物时,直接退出循环,后面默认都是0
break
dp[0][i] = 1
# 第一列
for i in range(1, row):
if obstacleGrid[i][0] == 1:
# 遇到障碍物时,直接退出循环,后面默认都是0
break
dp[i][0] = 1