代码随想录算法训练营第三十九天| 62.不同路径,63. 不同路径 II
62.不同路径
题目链接:不同路径
这道题,dp[i][j]的意思是到达(i,j)位置有多少种走法,
又因为只能往下和往右,所以到达(i,j)只能从上来或者从右来,推导公式就是dp[i][j] = dp[i-1][j] + dp[i][j-1]
只能往下,说明整个最上面一层应该都是从右往左直走的,就一种。
只能往右,说明整个最左面一层应该都是从上往下直走的,就一种。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# dp[i][j]到达(i,j)位置有多少种走法
dp = [[0]*n for _ in range(m)]
# 只能往下,说明最上面一层应该都是从右往左直走的,所以就一种
#for i in range(n):
#dp[0][i] = 1
# 只能往右,说明最左面一层应该都是从上往下直走的,所以就一种
dp[0][:] = [1]*n
for j in range(m):
dp[j][0] = 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]
是我愚蠢了,只要初始都为1就行了。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# dp[i][j]到达(i,j)位置有多少种走法
dp = [[1]*n for _ in range(m)]
# 只能往下,说明最上面一层应该都是从右往左直走的,所以就一种
#for i in range(n):
#dp[0][i] = 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
题目链接:不同路径 II
思路和上面一样,但是碰到障碍物的dp[i][j]得是0。
这题的注意点:
上面一条和左边一条要管到,并不是说有障碍物的那个点dp给0就行的,因为上面和右边一条本来就只有一条路好走,所以如果是碰到障碍物了,这条路之后都不通了,意思就是这两条碰到第一个障碍物之后的dp全是0。
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
if obstacleGrid[0][0] == 1: return 0
dp = [[1]*len(obstacleGrid[0]) for _ in range(len(obstacleGrid))]
k = len(obstacleGrid[0])
for i in range(len(obstacleGrid[0])):
if obstacleGrid[0][i] == 1:
dp[0][i] = 0
k = i
if i > k:
dp[0][i] = 0
k = len(obstacleGrid)
for j in range(len(obstacleGrid)):
if obstacleGrid[j][0] == 1:
dp[j][0] = 0
k = j
if j > k:
dp[j][0] = 0
for i in range(1,len(obstacleGrid)):
for j in range(1,len(obstacleGrid[0])):
if obstacleGrid[i][j] == 1:
dp[i][j] = 0
else:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[-1][-1]