leetcode-不同路径

69 阅读1分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

题目描述

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

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

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

  • 示例 1:

1.png

输入: m = 3, n = 7
输出: 28
  • 示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
  • 示例 3:
输入: m = 7, n = 3
输出: 28
  • 示例 4:
输入: m = 3, n = 3
输出: 6
  • 提示:
`1 <= m, n <= 100`
题目数据保证答案小于等于 `2 * 109`

实现思路

这道题由于只有两个方向咋一看很容易让我们去选择回溯回调来解决,尝试过的同学会发现答案是可以得出来但是超出了时间限制,所以这道题我们还是得用动态规划来解决,首先我们先构造一个二维数组空间,分析下动态规则的等式其实也并不难,第一行和第一列肯定都是1条路径,其余的格子是其上边和左边进入的所以可以得到等式list[i][j] = list[i -1][j] + list[i][j - 1],这样我们思路就很明朗了,下面是代码实现过程。

代码实现过程:

  1. 定义list构造一个mxn的二维数组用来记录到达每个格子有多少条路径
  2. 第一行和第一列肯定都是一条路径for循环赋值
  3. 其余格子按照等式list[i][j] = list[i -1][j] + list[i][j - 1]赋值
  4. 返回右下角格子得出题解
/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function(m, n) {
    let list = new Array(m).fill(0).map(e => new Array(n).fill(0))
    for(let i = 0; i < m; i++) {
        list[i][0] = 1
    }
    for(let i = 0; i < n; i++) {
        list[0][i] = 1
    }
    for (let i = 1; i < m; i++) {
        for (let j = 1; j < n; j++) {
            list[i][j] = list[i -1][j] + list[i][j - 1]
        }
    }
    return list[m - 1][n - 1]
};