LeetCode热题(JS版) - 62. 不同路径

92 阅读1分钟

问题描述

有一个 m x n 的网格图,初始时机器人位于左上角 (0, 0) 处。机器人每次只能向下或向右移动一步。目标是使机器人到达右下角 (m - 1, n - 1) 处,有多少条不同的路径可以到达终点?

示例

image.png

输入:m = 3, n = 7
输出:28
解释:从起点 (0, 0) 到终点 (2, 6) 有 28 条不同的路径。

解法

为了找出从起点到终点的所有不同路径,我们可以使用动态规划。假设 dp[i][j] 表示从 (0, 0) 走到 (i, j) 的不同路径数,其中 0 <= i < m0 <= 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];
}

image.png

时间复杂度分析

由于需要遍历整个 m x n 的矩阵,因此时间复杂度为 O(mn)O(mn)。反观动态规划的解法,则需要建立一个 m×nm \times n 的二维数组来存储中间结果,因此空间复杂度为 O(mn)O(mn)

因此,算法的时间复杂度为 O(mn)O(mn),空间复杂度也为 O(mn)O(mn)