Leetcode C++《热题 Hot 100-39》62.不同路径
- 题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 思路
- 方案1:感觉递归大法就能做hh,然后m=23, n=12超时了【也可以延伸成动态规划】
- 方案2:数学大法,一定要走m+n-2步,从中选择m-1向下,其余向右;
- 代码
class Solution {
public:
//方案1:感觉递归大法就能做hh,然后m=23, n=12超时了
/*int targetX;
int targetY;
int uniquePaths(int m, int n) {
targetX = m-1;
targetY = n-1;
return getPathNum(0,0);
}
int getPathNum(int x, int y) {
//向下 x y+1
//向右 x+1 y
//左上角坐标 0 0, 目标坐标[m-1, n-1]
if (x == targetX && y== targetY)
return 1;
if (x > targetX || y > targetY)
return 0;
return getPathNum(x, y+1)+getPathNum(x+1, y);
}*/
//方案2:数学大法,一定要走m+n-2步,从中选择m-1向下,其余向右;组合数学计算大法!
int uniquePaths(int m, int n) {
long long res = 1; //注意乘法可能会爆栈的
int t = min(m, n);
for (int i = 0; i < t-1; i++) {
//cout << i << " " << res << endl;
res = res * (m+n-2-i);
res = res / (i+1);
}
return res;
}
};