一、题目内容 中等
一个机器人位于一个 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
二、解题思路
先假设,m = 1,n = 1 的时候,这时有一条路,n 不断增大,还是一条路。
同理,n = 1 时,m 不断增大,还是一条路。
这会是我们后面的初始条件
假设,m = 2,n = 2 的情况,这时有 2 条路
我们把走到的那个格子,上面表上数字,表示走到这个格子,可以有几条路(左上角为原点)
于是,我们可以的得出结论:除了第一行、第一列的格子,其他格子的数
等于 它的上面格子 + 它的左边格子
由于机器人只能往右走、往下走 那么每个格子的道路的数,也就等于 它能从左边来的道路数 + 从上面来的道路数
- 我们用 dp 表示格子数组,m 表示对应第几行,n 表示对应第几列
- 所以由此写出递推公式:
dp[m][n] = dp[m - 1][n] + dp[m][n - 1]
- 而我们的初始化:
dp[0][n] = 1 dp[n][0] = 1
三、具体代码
/**
* @param {number} m
* @param {number} n
* @return {number}
*/
var uniquePaths = function (m, n) {
// 构造一个 m x n 的数组 dp
// 初始化 dp[0][n] = 1,dp[n][0] = 1
// 递推公式:dp[m][n] = dp[m-1][n] + dp[m][n-1]
const dp = new Array(m).fill(1).map(() => new Array(n).fill(1));
for (let i = 1; i < m; i++) {
for (let j = 1; j < n; j++) {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
}
}
return dp[m - 1][n - 1]
};
/**
* 时间复杂度:O(m x n x 2)
* 空间复杂度: O(m x n)
*/