每天一道算法题(二十三)

不同路径

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

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

问总共有多少条不同的路径?
在这里插入图片描述
例如,上图是一个7 x 3 的网格。有多少可能的路径?

示例 1:

输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例 2:

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

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 10 ^ 9
/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function(m, n) {
  var arr = new Array(n).fill(1)
  for(var i = 0 ;i<n;i++){
    arr[i] = new Array(m).fill(1)
  } // 形成一个m*n的矩阵,值代表每个位置的路径,初始值全部设置为1
  // 思路
  // 从右上角开始计算,每个位置有多少条路径可以到达只需计算该位置的左一个位置的路径+上一个位置的路径(因为只能向下或者向右移动)
  for(var x = 1;x<n;x++){ 
    for(var y = 1;y<m;y++){ // 排除第一行和第一列(因为只能向右或者向下走一条路,不需要额外计算)
      arr[x][y] = arr[x-1][y]+arr[x][y-1] // 该位置的路径 = 左一个位置的路径加上上一个位置的路径
    }
  }
  return arr[m-1][n-1] // 返回右下角的位置即可
};

输出(7,3)对应的矩阵看一下应该能明白
在这里插入图片描述
执行用时 :68 ms
内存消耗 :32.4 MB

太多for循环了,进行改进。
通过看到上面的矩阵图可以发现,在第二行中,从第二列开始,都是前一个位置的路径加上了1,其实就是固定了。那么可以省略循环为每一列赋值的情况。

/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function(m, n) {
  var arr = new Array(n).fill(1)
  for(var x = 1;x<m;x++){ // 循环列数次
    for(var y = 1;y<n;y++){ // 计算每一列的路径数,从1开始,因为arr[0]是固定的1
      arr[y] = arr[y-1]+arr[y] // 下一列的路径数覆盖当前的路径数
    }
  }
  return arr[n-1]
}

执行用时 :60 ms
内存消耗 :32.2 MB

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章