1. 程式人生 > 其它 >leetcode 62. 不同路徑(中等)

leetcode 62. 不同路徑(中等)

技術標籤:leetcode動態規劃leetcodepython

leetcode 62. 不同路徑(中等)

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

步驟

由於我們每一步只能從向下或者向右移動一步,因此要想走到 (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]