每日一算--不一樣路徑

題目

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記爲「Start」 )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記爲「Finish」)。 問總共有多少條不一樣的路徑?
數組

舉例請看圖 bash

  • 例如,上圖是一個7 x 3 的網格。有多少可能的路徑
  • 說明:m 和 n 的值均不超過 100。

示例 1:ui

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑能夠到達右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右
複製代碼

示例 2:spa

輸入: m = 7, n = 3
輸出: 28
複製代碼

平常找規律

  • 每次只能往下,或者往右,所以每走一步,網格要麼少一行、要麼少一列,所以 動態轉移方程爲: dp(m,n) = dp(m-1,n) + dp(m,n-1),邊界條件爲: m==1 dp(1,n) == 1 n==1 dp(m,1) ==1

實現方式

遞歸實現

function uniquePaths(m, n) {
  if (m == 1 || n == 1) {
    return 1
  }
  return uniquePaths(m-1, n) + uniquePaths(m, n-1)
}
複製代碼

循環迭代

function uniquePaths(m, n) {
  // 初始化一個二維數組
  let dp = []
  for (let i = 0; i < m; i++) {
    let temp = []
    dp.push(temp)
  }
  
  // 遍歷計算出全部dp的值
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (i == 0 || j == 0) {
        dp[i][j] = 1
      } else {
        dp[i][j] = dp[i-1][j] + dp[i][j-1]
      }
    }
  }
  return dp[m-1][n-1]
}
複製代碼

參考文檔

相關文章
相關標籤/搜索