题目:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 109
来源:力扣(LeetCode)
链接:62. 不同路径 - 力扣(LeetCode) (leetcode-cn.com)
方法一(排列组合):
这道题我第一眼看到首先想到的是数学里的排列组合(组合数学中的一种)_百度百科 (baidu.com),这种题想必许多高中生都做过,方法也是比较简单的。
我们假设一共要走m+n步,那么只要让其中的m步向右走,剩余的n步就一定是向下走,计算的话就是C(m+n,n)=C(m+n,m)。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
son=min(m-1,n-1);mother=m+n-2
up=1;down=1
for i in range(son):
up*=son-i
for i in range(son):
down*=mother-i
if int(down/up)==0:
return 1
else:
return int(down/up)
方法二(动态规划):
我们假设走到了第k步,那么前面步骤的总走法就是前面两个k-1步的走法之和(从左上到右下只能是上一步从左边或上边走来,不然就没有意义了),用图像来表示就是这样。
这样我们就需要创建一个二维列表了:
dp=[]
for i in range(m):
dp.append([1]*n) #默认起始值均为1
创建以后,就可以按照这样的思路进行计算了,这和杨辉酸角的算法类似LeetCode#118. 杨辉三角_如风Zhhh的博客-CSDN博客
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp=[]
for i in range(m):
dp.append([1]*n)
for i in range(m-1):
for j in range(n-1):
dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j]
return dp[m-1][n-1]