leetcode 62. 不同路徑(中等)
阿新 • • 發佈:2020-12-10
技術標籤:leetcode動態規劃leetcodepython
leetcode 62. 不同路徑(中等)
一個機器人位於一個 m x n
網格的左上角 (起始點在下圖中標記為 “Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish” )。
問總共有多少條不同的路徑?
示例 1:
輸入:m = 3, n = 7
輸出:28
示例 2:
輸入:m = 3, n = 2
輸出:3
解釋: 從左上角開始,總共有 3 條路徑可以到達右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 3:
輸入:m = 7, n = 3
輸出:28
示例 4:
輸入:m = 3, n = 3
輸出:6
步驟
由於我們每一步只能從向下或者向右移動一步,因此要想走到 (i, j)(i,j),如果向下走一步,那麼會從 (i-1, j)(i−1,j) 走過來;如果向右走一步,那麼會從 (i, j-1)(i,j−1) 走過來。因此我們可以寫出動態規劃轉移方程:
f(i, j) = f(i-1, j) + f(i, j-1)
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
f = [[1] * n] + [[1] + [0] * (n - 1) for _ in range(m - 1)]
for i in range(1,m):
for j in range(1,n):
f[i][j]=f[i-1][j]+f[i][j-1]
return f[m-1][n-1]
注意到 f(i, j)f(i,j) 僅與第 ii 行和第 i-1i−1 行的狀態有關,因此我們可以使用滾動陣列代替程式碼中的二維陣列,使空間複雜度降低為 O(n)。
class Solution:
def uniquePaths (self, m: int, n: int) -> int:
f = [1]*n
for i in range(1,m):
for j in range(1,n):
f[j]+=f[j-1]
return f[-1]