2021-01-28 | 62. 不同路徑
阿新 • • 發佈:2021-02-20
技術標籤: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]
};