- 题目详述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3
输出: 28
二.自我探寻(这道题自己用递归做的很差 可以直接跳到网络学习过程)
思路:一条路径的特征是在哪个点下去(或者哪个点向右走)
代码:class Solution {
public int uniquePaths(int m, int n) {
int sum=0;
if(m==1||n==1)
{
return 1;
}
int p=Math.max(m,n);
int q=Math.min(m,n);
for(int i=p;i>0;i--)
{
sum=sum+painttree(q-1,1,i);
}
return sum;
}
public static int painttree(int n,int h,int q)/**n树应该的高度,h树目前的高度,q目前点的值**/
{
if(h==n-1)
return q;
if(h==n)
return 1;
int sum=0;
for(int j=q;j>0;j--) {
sum=sum+ painttree(n,h+1, j);
}
return sum;
}
}
评价:
- 网络学习过程
思路:与之前想的有点类似,一条路径不同于其他路径的特征是在哪里选择向下。而走到终点 一定是m+n-2步,是一个组合问题,在这些总步数中挑n-1步向下即可
C(m+n-2,n-1) 而代码求解组合公式 都是O(n),同时在按照这个思路编程时 遇到了两个问题
- 超出int界限,用long类型
- 拿m=7,n=3举例 公式如下 8!/ (2!*6!)
我们算过这个公式 都知道 可以简化 成 7*8/2!
故代码也可以简化
代码:class Solution {
public int uniquePaths(int m, int n) {
long a=1;
long b=1;
int p=Math.max(m,n);
int q=Math.min(m,n);
for(int i=p;i<=p+q-2;i++)
{
a=a*i;
}
for(int j=1;j<=q-1;j++)
{
b=b*j;
}
int f=(int)(a/b);
return f;
}
}
评价:
四.Python实现