LeetCode 「中等」62.不同路径

sankigan2025-3-5算法LeetCode

不同路径open in new window

题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

示例

输入:m = 3, n = 7
输出:28

输入:m = 3, n = 2
输出:3

输入:m = 7, n = 3
输出:28

输入:m = 3, n = 3
输出:6

解答

动态规划

问题的本质

  • 机器人从左上角到右下角的每一步,只能向右或向下移动,这意味着每个位置的路径数取决于其上方和左方的位置
  • 动态规划可以很好地利用这种“状态转移”关系,通过计算每个位置的路径数,最终得到终点的路径数

关键思路

  1. 定义状态
  • dp[i][j] 表示从起点 (0, 0) 到达位置 (i, j) 的不同路径数
  1. 状态转移方程
  • 由于机器人只能从上方或者左方到达当前位置,因此:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
  1. 初始化
  • 第一行和第一列的所有位置都只有一条路径可以到达(只能一直向右或一直向下),因此初始化为 1:
dp[0][j] = 1;
dp[i][0] = 1;
  1. 计算结果
  • 遍历整个网格,根据状态转移方程计算每个位置的路径数,最终 dp[m - 1][n - 1] 即为结果
Code
/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function(m, n) {
  // 创建一个 m x n 的二维数组 dp,初始化为 1
  const dp = Array.from({ length: m }, () => Array(n).fill(1));

  // 遍历网格,计算每个位置的路径数
  for (let i = 1; i < m; ++i) {
    for (let j = 1; j < n; ++j) {
      dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
    }
  }

  // 返回右下角的路径数
  return dp[m - 1][n - 1];
};
更新于 2025/3/21 17:36:47