62.不同路径
-
多了一个纬度,思路差不多
-
自己写的问题在于没有将第一行和第一列的所有值初始化为1,如下
class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
dp = [[0]*n]*m
dp[0][1] = 1
dp[1][0] = 1
for i in range(1,m):
for j in range(1,n):
dp[i][j]=dp[i][j-1]+dp[i-1][j]
return dp[m-1][n-1]
-
正确写法:
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
#step1: dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径
# dp = [[0]*n]*m #这道题这么写没报错,但是有问题,在63. 不同路径 II中就有问题,所以用下面的创建方式
dp = [[0 for _ in range(n)] for _ in range(m)]
print(dp)
#step2: 递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
#step3: 初始化:dp[i][0] = 1, dp[0][j] = 1(注意不只是dp[1][0]=1, dp[0][1]=1)
for i in range(m):
dp[i][0] = 1
print(dp)
for j in range(n):
dp[0][j] = 1
print(dp)
#step4: 从左到右一层一层遍历
for i in range(1, m):
for j in range(1, n):
dp[i][j] = dp[i][j-1] + dp[i-1][j]
#step5: 打印检查
return dp[m-1][n-1]
63. 不同路径 II
注意二维数组创建方式
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
#step1: dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径
row = len(obstacleGrid)
col = len(obstacleGrid[0])
dp = [[0 for _ in range(col)] for _ in range(row)] #不可 dp = [[0]*col]*row
print('init:', dp)
#step2: 递推公式:
'''dp[i][j] = dp[i - 1][j] + dp[i][j - 1]. 但这里需要注意一点,因为有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)'''
#step3: 初始化:
'''因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。'''
if obstacleGrid[0][0] != 1:
dp[0][0] = 1
for i in range(1, row):
if obstacleGrid[i][0] != 1:
dp[i][0] = dp[i-1][0]
for j in range(1, col):
if obstacleGrid[0][j] != 1:
dp[0][j] = dp[0][j-1]
print(dp)
#step4: 遍历顺序:从左到右一层一层遍历
for i in range(1, row):
for j in range(1, col):
if obstacleGrid[i][j] != 1:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
#step5: 打印检查
return dp[row-1][col-1]