leetcode62. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 "Finish" )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 109
目录
题目描述
在一个 m 行 n 列的二维网格中,从左上角开始,每次只能向下或者向右移动一步,要求到达右下角。有多少种不同的路径?
题目分析
这是一个经典的动态规划问题。我们可以通过计算到达每个位置的方法数来最终得到到达右下角的方法数。
算法
状态转移方程
dp[i][j]
表示到达第i
行第j
列的路径数。- 状态转移方程为
dp[i][j] = dp[i-1][j] + dp[i][j-1]
,因为到达第i
行第j
列的方法数是从第i-1
行第j
列向下移动一格,或者从第i
行第j-1
列向右移动一格。
初始化
dp[0][j] = 1
,因为从左上角开始,到达第j
列的方法数是1。dp[i][0] = 1
,因为从左上角开始,到达第i
行的方法数是1。
遍历进行状态转移
- 从第1行第1列开始,遍历到第
m
行第n
列,根据状态转移方程更新dp[i][j]
。
返回结果
dp[m-1][n-1]
即为到达右下角的方法数。
流程图
是 是 开始 初始化dp数组 遍历i从1到m 遍历j从1到n 更新dp i j 更新结果 结束
代码实现
cpp
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for(int i=0; i<=m; i++) {
dp[i][0] = 1;
}
for(int j=0; j<=n; j++) {
dp[0][j] = 1;
}
for(int i=1; i<m; i++) {
for(int j=1; j<n; j++) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};
算法分析
- 时间复杂度:O(m*n),因为我们需要遍历整个网格。
- 空间复杂度:O(m*n),用于存储DP数组。
易错点
- 注意初始化
dp[0][j]
和dp[i][0]
的值。 - 确保在遍历时正确应用状态转移方程。
相似题目
题目 | 链接 |
---|---|
不同路径 | LeetCode 62 |
不同路径 II | LeetCode 63 |
打家劫舍 | LeetCode 198 |