62 -不同路径
1、题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?
2、解析1-动态规划法
- 令 dp[i][j] 是到达 i, j 最多路径
- 动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
- 注意,对于第一行 dp[0][j],或者第一列 dp[i][0],由于都是在边界,所以只能为 1
时间复杂度:O(m*n)O(m∗n)
空间复杂度:O(m * n)O(m∗n)
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# 构建一个m*n的矩阵
f = [[1]*n] + [[1]+[0] * (n-1) for _ in range(m-1)]
print(f)
for i in range (1,m):
for j in range (1,n):
f[i][j] = f[i - 1][j] + f[i][j - 1]
return f[m-1][n-1]
3、解析2-排列组合
从左上角到右下角的过程中,我们需要移动 m+n-2m+n−2 次,其中有 m-1m−1 次向下移动,n-1n−1 次向右移动。因此路径的总数,就等于从 m+n-2m+n−2 次移动中选择 m-1m−1 次向下移动的方案数。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
return comb(m + n - 2, n - 1)