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

不同路徑

一個機器人位於一個 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

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