62. 不同路径
题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
solution
一定要注意浅拷贝!要[:] or .copy()
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# dp records the number of pathes from (0,0)
temp=[0]*n
dp=[]
for i in range(m):dp.append(temp[:])# 这里一定不要浅拷贝!!!!
for i in range(n):dp[0][i]=1
for i in range(m):dp[i][0]=1
for i in range(m):
for j in range(n):
if i==0 or j==0: continue
dp[i][j]=dp[i-1][j]+dp[i][j-1]
return dp[m-1][n-1]
63. 不同路径 II
题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
solution
跟前一个题目最大的区别就是初始化不是仅仅把第一列和第一行设置为1,而是要考虑路障,如果有路障则设置为0,如果前面一个(或者上一个)dp=0,那么后面/下面应该均为0,表示没有路达到这里
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m=len(obstacleGrid)
n=len(obstacleGrid[0])
temp=[0]*n
dp=[]
for i in range(m):dp.append(temp.copy())
# dp数组初始化 跟前一道题最大的区别就是初始化
# 第一横排不能被全部设置为1->如果前面有0,后面应该全是0
for i in range(m):
for j in range(n):
if i==0 and obstacleGrid[i][j]==0:
if j==0:dp[i][j]=1
if j>0 and dp[i][j-1]!=0:dp[i][j]=1
if j==0 and obstacleGrid[i][j]==0:
if i==0:dp[i][j]=1
if i>0 and dp[i-1][j]!=0:dp[i][j]=1
for i in range(m):
for j in range(n):
if i==0 or j==0:continue
if obstacleGrid[i][j]==1:dp[i][j]=0
else:
dp[i][j]=dp[i-1][j]+dp[i][j-1]
print(dp)
return dp[-1][-1]