思路一:排列组合
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
#排列组合,一共走m+n-2步,选出m-1条横的
def f(n):
if n<2:
return 1
res=1
for i in range (1,n+1):#注意最后是i=n
res=res*i
return res
ans=f(m+n-2)//(f(m-1)*f(n-1))
return ans
思路二:动态规划(比排列组合慢一点)
我们用 dp(i,j)
表示从左上角走到 (i,j) 的路径数量,其中 i和 j的范围分别是 [0, m) 和[0,n)。
由于我们每一步只能从向下或者向右移动一步,因此要想走到 (i, j)(i,j),如果向下走一步,那么会从(i−1,j) 走过来;如果向右走一步,那么会从 (i,j−1) 走过来。因此我们可以写出动态规划转移方程:
f(i, j) = f(i-1, j) + f(i, j-1)
需要注意的是,如果i=0,表示此时“贴墙”,只有一种情况,f(i−1,j) =1
即可,同理 j=0,f(i,j-1) =1
最终的答案即为 f(m-1,n-1)
,即f[-1][-1]
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[0 for _ in range(n)] for _ in range(m)]
for i in range(m):
for j in range(n):
if i==0 or j==0:
dp[i][j]=1
else:
dp[i][j]=dp[i-1][j]+dp[i][j-1]
return dp[-1][-1]