一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
示例 1:
输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3 输出: 28
提示:
扫描二维码关注公众号,回复:
10969049 查看本文章
1 <= m, n <= 100
- 题目数据保证答案小于等于
2 * 10 ^ 9
解答(C++):
思路:在m+n中寻找n条路径,数学的组合问题C(m+n,n)
class Solution { public: int uniquePaths(int m, int n) { // [0] 数学法: 在(m-1 + n-1)中寻找m-1 if (m == 1 || n == 1) return 1; if (m > n) swap(m, n);//保证m<=n unsigned long long int temp = 1; unsigned long long int result = 1; for (int i = 1; i <= m-1 ; i++) { temp *= i; } for (int i = n; i <= m + n - 2; i++) { result *= i; } result = result / temp; return result; } };
思路:归纳法,每个节点只可以从左边或者上面过来,路径数 = 左边邻节点 + 上面邻节点
class Solution { public: int uniquePaths(int m, int n) { // [1] 归纳法 vector<vector<int>> vvec(m); for (int i = 0; i < m; i++) { vector<int> vec(n); vvec[i] = vec; for (int j = 0; j < n; j++) { if ( i==0 || j==0 ) { vvec[i][j] = 1; } else { vvec[i][j] = vvec[i-1][j] + vvec[i][j-1]; } } } return vvec[m-1][n-1]; } };