leetcode【中等】62、不同路径

在这里插入图片描述
思路一:排列组合

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]

猜你喜欢

转载自blog.csdn.net/qq_40707462/article/details/112537502