一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution(object): def uniquePaths(self, m, n): dp = [[0 for _ in range(n)] for _ in range(m)] dp[0][0] = 0 for i in range(m): dp[i][0] = 1 for j in range(n): dp[0][j] = 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]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution(object): def uniquePaths(self, m, n): """ :type m: int :type n: int :rtype: int """ # 采用二位数组形式的动态规划 # f[i][j]表示当前移动到的总次数,要求f[-1][-1] # 状态转移公式:f[i][j] = f[i-1][j]+f[i][j-1] # 初始值:每一步移动的次数可以看做横轴和纵轴的和,因此 f[i][0] = 1,f[0][j]=1 # 运动的轨迹:要么往下,要么往左 # 时间复杂度:O(m*n),空间复杂度:O(m*n) f = [[0]*n for zong in range(m)] for i in range(m): f[i][0] = 1 for j in range(n): f[0][j] = 1 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[-1][-1] """优化空间复杂度为O(n)""" # 对二维矩阵进行压缩成一位数组,将最新生成的值覆盖掉旧的值,逐行求解当前位置的最新路径条数! # 实质:在于动态计算并替换当前位置下的路径数最新值 # 状态转移公式变成:f[i] = f[i-1]+f[i] # 初始值: f = [1]*m,取横轴 # f[-1]表示可能路径的总数 # 空间复杂度:O(n),时间复杂度:O(m*n) f = [1]*m for j in range(1,n): for i in range(1,m): f[i] = f[i-1]+f[i] return f[-1] 作者:yu-fa-tang-you-dian-tian 链接:https://leetcode-cn.com/problems/unique-paths/solution/dong-tai-gui-hua-ya-suo-shu-zu-you-hua-kong-jian-f/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
纯数学:排列组合 标准组合公式:C(n-1,m+n-2) 代码 class Solution: def uniquePaths(self, m: int, n: int) -> int: a=b=1 for i in range(1,n): a=a*i for i in range(m,m+n-1): b=b*i return b//a 作者:jutraman 链接:https://leetcode-cn.com/problems/unique-paths/solution/pythonbu-tong-lu-jing-by-jutraman/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。