62.不同路径
1.题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
2.实现
空间优化的地方好好看下
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# dp = [[0]*n for _ in range(m)] # m行n列
# dp[0][0] = 1
# for i in range(1, m):
# dp[i][0] = 1
# for j in range(1, n):
# 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[m - 1][n - 1]
# 空间优化,此时用dp[n]去记录每一列的路径总数
dp = [0] * n
for j in range(n):
dp[j] = 1 # 此时更新第一行的dp[n]
for i in range(1, m):
for j in range(1, n):
dp[j] += dp[j - 1]
return dp[n - 1]
63. 不同路径 II
1.题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
2.实现
障碍物对dp数组的影响,分开写初始化是根据递推公式防止数组越界
这个题的空间优化没想出来
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m, n = len(obstacleGrid), len(obstacleGrid[0])
# dp = [[0]*n for _ in range(m)] # m行n列,且本身初值为0,无需对障碍处更新值
# for i in range(m):
# if obstacleGrid[i][0] == 1:
# break
# dp[i][0] = 1
# for j in range(n):
# if obstacleGrid[0][j] == 1:
# break
# 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]
# 空间优化
dp = [0] * n
for j in range(n):
if obstacleGrid[0][j] == 1:
break
dp[j] = 1
for i in range(1, m):
for j in range(n): # 此时第一列因为有障碍物,所以要判断
if obstacleGrid[i][j] == 1:
dp[j] = 0
elif j > 0:
dp[j] += dp[j - 1]
return dp[n - 1]