1. 程式人生 > 其它 >2021-01-28 | 62. 不同路徑

2021-01-28 | 62. 不同路徑

技術標籤:2021 LeetCode每日一題動態規劃演算法資料結構leetcodeJavaScript

1. 題目描述

一個機器人位於一個 m x n網格的左上角 (起始點在下圖中標記為 “Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish” )。

問總共有多少條不同的路徑?

示例 1:
在這裡插入圖片描述

輸入: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 * 10

2. 解題思路

這個題目和爬樓梯問題其實是一樣的思路,只不過爬樓梯問題算是一維的問題,而這個問題是一個二維的問題。看到這個問題,我們自然而然的就能想到動態規劃

每一個網格的路徑數都和其上側和左側的路徑數相關,可以得出遞推方程:

a[i][j] = a[i - 1][j] + a[i][j - 1]

首先初始化一個m * n 的二維陣列,陣列的所有節點值都先初始為0,由於最上邊一行和最左邊一列都是邊界,只能有一種走法,所以初始為1。然後根據遞推方程求解即可。

複雜度分析:

  • 時間複雜度:O(mn),我們需要兩層遍歷,所以空間複雜度為O(mn)。
  • 空間複雜度:O(mn),我們需要一個m * n 的二維陣列來儲存所有狀態,所以所需空間複雜度為O(mn)。

3. 程式碼實現

/**
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = function(m, n) {
    const dp = new Array(m).fill(0).map(() => new Array(n).fill(0))

    for(let i = 0; i <
m; i++){ dp[i][0] = 1 } for(let j = 0; j < n; j++){ dp[0][j] = 1 } for(let i = 1; i < m; i++){ for(let j = 1; j < n; j++){ dp[i][j] = dp[i - 1][j] + dp[i][j - 1] } } return dp[m - 1][n - 1] };

4. 提交結果

在這裡插入圖片描述