问题描述
有一个 m x n 的网格图,初始时机器人位于左上角 (0, 0) 处。机器人每次只能向下或向右移动一步。目标是使机器人到达右下角 (m - 1, n - 1) 处,有多少条不同的路径可以到达终点?
示例
输入:m = 3, n = 7
输出:28
解释:从起点 (0, 0) 到终点 (2, 6) 有 28 条不同的路径。
解法
为了找出从起点到终点的所有不同路径,我们可以使用动态规划。假设 dp[i][j] 表示从 (0, 0) 走到 (i, j) 的不同路径数,其中 0 <= i < m,0 <= j < n。
显然,到达第一行和第一列的任何位置时只有一种走法,因为机器人只能向下或向右移动。因此,对于矩阵中的第一行和第一列,dp[i][0] = dp[0][j] = 1。
对于其他位置 (i, j),由于机器人只能向下或向右移动,因此到达 (i, j) 的不同路径数等于到达 (i - 1, j) 和 (i, j - 1) 的不同路径数之和。因此,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。
最终的答案即为 dp[m - 1][n - 1],即从起点走到终点的所有不同路径数。
代码实现
以下是使用 Typescript 实现的代码:
function uniquePaths(m: number, n: number): number {
const dp = Array.from({ length: m }, () => new Array(n).fill(0));
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (i === 0 || j === 0) {
// 第一行和第一列只有一种走法
dp[i][j] = 1;
} else {
// 其他位置的不同路径数等于上方和左侧的不同路径数之和
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
}
return dp[m - 1][n - 1];
}
时间复杂度分析
由于需要遍历整个 m x n 的矩阵,因此时间复杂度为 。反观动态规划的解法,则需要建立一个 的二维数组来存储中间结果,因此空间复杂度为 。
因此,算法的时间复杂度为 ,空间复杂度也为 。