Update 0063.不同路径II.md

This commit is contained in:
jianghongcheng
2023-06-01 17:48:22 -05:00
committed by GitHub
parent 6128c57e15
commit 906293efae

View File

@ -271,69 +271,130 @@ class Solution {
### Python ### Python
动态规划(版本一)
```python ```python
class Solution: class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: def uniquePathsWithObstacles(self, obstacleGrid):
# 构造一个DP table m = len(obstacleGrid)
row = len(obstacleGrid) n = len(obstacleGrid[0])
col = len(obstacleGrid[0]) if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1:
dp = [[0 for _ in range(col)] for _ in range(row)] return 0
dp[0][0] = 0 if obstacleGrid[0][0] == 1 else 1 dp = [[0] * n for _ in range(m)]
if dp[0][0] == 0: for i in range(m):
return 0 # 如果第一个格子就是障碍return 0 if obstacleGrid[i][0] == 0: # 遇到障碍物时,直接退出循环,后面默认都是0
# 第一行 dp[i][0] = 1
for i in range(1, col): else:
if obstacleGrid[0][i] == 1:
# 遇到障碍物时直接退出循环后面默认都是0
break break
dp[0][i] = 1 for j in range(n):
if obstacleGrid[0][j] == 0:
# 第一列 dp[0][j] = 1
for i in range(1, row): else:
if obstacleGrid[i][0] == 1:
# 遇到障碍物时直接退出循环后面默认都是0
break break
dp[i][0] = 1 for i in range(1, m):
# print(dp) for j in range(1, n):
if obstacleGrid[i][j] == 1:
continue
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
return dp[m - 1][n - 1]
for i in range(1, row):
for j in range(1, col):
if obstacleGrid[i][j] == 0:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
return dp[-1][-1]
``` ```
动态规划(版本二)
```python
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid):
m = len(obstacleGrid) # 网格的行数
n = len(obstacleGrid[0]) # 网格的列数
if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1:
# 如果起点或终点有障碍物直接返回0
return 0
dp = [[0] * n for _ in range(m)] # 创建一个二维列表用于存储路径数
# 设置起点的路径数为1
dp[0][0] = 1 if obstacleGrid[0][0] == 0 else 0
# 计算第一列的路径数
for i in range(1, m):
if obstacleGrid[i][0] == 0:
dp[i][0] = dp[i - 1][0]
# 计算第一行的路径数
for j in range(1, n):
if obstacleGrid[0][j] == 0:
dp[0][j] = dp[0][j - 1]
# 计算其他位置的路径数
for i in range(1, m):
for j in range(1, n):
if obstacleGrid[i][j] == 1:
continue
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
return dp[m - 1][n - 1] # 返回终点的路径数
```
动态规划(版本三)
```python ```python
class Solution: class Solution:
""" def uniquePathsWithObstacles(self, obstacleGrid):
使用一维dp数组 if obstacleGrid[0][0] == 1:
""" return 0
dp = [0] * len(obstacleGrid[0]) # 创建一个一维列表用于存储路径数
# 初始化第一行的路径数
for j in range(len(dp)):
if obstacleGrid[0][j] == 1:
dp[j] = 0
elif j == 0:
dp[j] = 1
else:
dp[j] = dp[j - 1]
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: # 计算其他行的路径数
for i in range(1, len(obstacleGrid)):
for j in range(len(dp)):
if obstacleGrid[i][j] == 1:
dp[j] = 0
elif j != 0:
dp[j] = dp[j] + dp[j - 1]
return dp[-1] # 返回最后一个元素,即终点的路径数
```
动态规划(版本四)
```python
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid):
if obstacleGrid[0][0] == 1:
return 0
m, n = len(obstacleGrid), len(obstacleGrid[0]) m, n = len(obstacleGrid), len(obstacleGrid[0])
# 初始化dp数组 dp = [0] * n # 创建一个一维列表用于存储路径数
# 该数组缓存当前行
curr = [0] * n # 初始化第一行的路径数
for j in range(n): for j in range(n):
if obstacleGrid[0][j] == 1: if obstacleGrid[0][j] == 1:
break break
curr[j] = 1 dp[j] = 1
for i in range(1, m): # 从第二行开始 # 计算其他行的路径数
for j in range(n): # 从第一列开始,因为第一列可能有障碍物 for i in range(1, m):
# 有障碍物处无法通行状态就设成0 if obstacleGrid[i][0] == 1:
dp[0] = 0
for j in range(1, n):
if obstacleGrid[i][j] == 1: if obstacleGrid[i][j] == 1:
curr[j] = 0 dp[j] = 0
elif j > 0: else:
# 等价于 dp[j] += dp[j - 1]
# dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
curr[j] = curr[j] + curr[j - 1] return dp[-1] # 返回最后一个元素,即终点的路径数
# 隐含的状态更新
# dp[i][0] = dp[i - 1][0]
return curr[n - 1]
``` ```