62. 不同路径
题目链接:62. 不同路径
分析一
- 确定dp数组(dp table)以及下标的含义
dp数组二维,表示网格内的每个点,dp[i][j]表示从起点到(i,j)的路径条数- 确定递推公式
dp[i][j] = dp[i-1][j] + dp[i][j-1]- dp数组如何初始化
最左上角的元素初始化为1
第0行初始化为 dp[0][j] = dp[0][j-1]
第0列初始化为 dp[i][0] = dp[i-1][0]- 确定遍历顺序
先列再行,先行再列都可以- 举例推导dp数组
m * n = 2 * 2
dp[1][1] = dp[0][1] + dp[1][0] = 2
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[0] * n for _ in range(m)]
dp[0][0] = 1
for i in range(1, m):
dp[i][0] = dp[i - 1][0]
for j in range(1, n):
dp[0][j] = dp[0][j - 1]
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
题目链接:63. 不同路径 II
分析一
基于62题的分析,修改一下DP数组初始化和dp数组推导式生效条件:只有该格没有障碍物时,才使用62的逻辑,不然跳过。
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m, n = len(obstacleGrid), len(obstacleGrid[0])
dp = [[0] * n for _ in range(m)]
if not obstacleGrid[0][0]:
dp[0][0] = 1
for i in range(1, m):
if not obstacleGrid[i][0]:
dp[i][0] = dp[i - 1][0]
for j in range(1, n):
if not obstacleGrid[0][j]:
dp[0][j] = dp[0][j - 1]
for i in range(1, m):
for j in range(1, n):
if not obstacleGrid[i][j]:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
return dp[-1][-1]