一个机器人位于一个 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
Method 1:
根据题目,移动方式只有:往右、往下两种。
因此,可以使用状态转移方程: f [ i ] [ j ] = f [ i-1 ] [ j ] + f [ i ] [ j-1 ]
但是需要注意:当移动到最右边或最下边时,则仅有向下或向右两种移动方式。
Code:
class Solution {
public:
// 不同路径
int uniquePaths(int m, int n) {
// 首先初始化一个m行n列的二维数组
// 用来存储每一个位置的路径数量
vector<vector<int>> result(m, vector<int>(n));
// 递归遍历行
for(int i = 0;i < m;i++)
{
// 递归遍历列
for(int j = 0;j < n;j++)
{
// 如果任何一维到达边界
// 即可确定不存在其他分支路径了
if(i == 0 || j == 0)
// 该点路径数量为1
result[i][j] = 1;
else
// 如果不是边界,则使用状态转移方程来计算当前点路径的数量
result[i][j] = result[i - 1][j] + result[i][j - 1];
}
}
// 右下角的元素就是所有路径的总数
return result[m - 1][n - 1];
}
};
Method 2:
基于递归来寻找不同路径。
(这种方法会导致时间超出限制,但是经过验证,结果是正确的,因此放出来仅供参考!!!)
Code:
class Solution{
public:
// 递归遍历不同位置上的路径数量
void Get_sub_path(int m,int n,int &result){
// 如果任何一维到达边界
// 即可确定不存在其他分支路径了
if(m==0||n==0){
// 路径数量+1
result++;
// 结束该分支的递归
return;
}
// 向右移一步,然后递归遍历
Get_sub_path(m-1,n,result);
// 向左移一步,然后递归遍历
Get_sub_path(m,n-1,result);
}
// 不同路径
int uniquePaths(int m,int n){
// 记录路径数量
int result=0;
// 递归遍历
Get_sub_path(m-1,n-1,result);
// 返回路径数量
return result;
}
};
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-paths
Reference: