原题:Leetcode62 不同路径
https://leetcode-cn.com/problems/unique-paths/
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
1.数学方法
看到这题 脑袋里面马上就想到高中排列组合问题,直接用排列组合就能得到路径关于m,n的表达式了,编程只用算阶乘就行了。当然,这个只是写得好玩,还是得用别的方法才行。
public class Solution {
public int UniquePaths(int m, int n) {
double fac1 = 1;
double fac2 = 1;
int j = (m <= n ? m : n) - 1;
int k = m + n - 2;
for (int i = 1; i <= j; i++)
{
fac1 = fac1 * i;
fac2 = fac2 * k;
k = k - 1;
}
return (int)(fac2 / fac1);
}
}
2.递归
很容易理解,当m=n=1的时候路径是一条,其他时候 坐标m,n的点的路径是点m-1,n和点m,n-1路径的和。这样就能用递归去写了。
但是运行却超出了时间限制。
public class Solution {
public int UniquePaths(int m, int n) {
if (m <= 0 || n <= 0)
return 0;
if (m == 1 || n == 1)
{
return 1;
}
else
{
return UniquePaths(m, n - 1) + UniquePaths(m - 1, n);
}
}
}
3.动态规划
这个是看了马老师的blog之后知道的方法。感觉原理和我用递归一样,只是对于每个坐标m,n 都用坐标m,n的点的路径是点m-1,n和点m,n-1路径的和这个规律给出了路径数。blog链接如下
https://blog.csdn.net/LSGO_MYP/article/details/100775739
所以这里有一个问题,同样的原理下,为什么递归的方法执行起来比动态规划要慢。我感觉它们执行的运算都是一样的每个m,n坐标就算了一次。