leetcode 62不同路徑

2021-09-26 15:11:30 字數 1164 閱讀 4406

採用動態規劃解決。

設g[m][n]代表整個網格,dp[i][j]為代表從g[0][0]到g[i][j]路徑數量。由規則可知:

狀態轉移方程為:dp[i][j]=dp[i-1][j]+dp[i][j-1],(1<=i**:

class solution:

def uniquepaths(self, m: int, n: int) -> int:

dp = [[1]*n] +[[1]+[0]*(n-1) for _ in range(m-1)]

for i in range(1,m):

for j in range(1,n):

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

return dp[m-1][n-1]

時間複雜度和空間複雜度都為:o(mn)

優化:由狀態轉移方程可知:

dp[i][j]只需要它上面的元素和左邊的元素,即dp[i][j-1]和dp[i-1][j],而我們最終想要的結果是dp[m-1][n-1],也就是說我們在求第dp的第i行的時候,只需要i-1行的資料,其它的都是中間值,可以不要,所以我們只需要兩行就可以了第i行和第i-1行。

繼續優化:(滾動陣列)

但是仔細觀察,在我們求dp[i][j]時候,dp[i][j]以及dp[i][j]後面的資料以及dp[i-1][0]到dp[i-1][j](不包括)都是沒有用的,即標有紅線的空間是沒有用的。故我們恰好可以將兩行合併為一行。

dp[j-1]

dp[j]

此時狀態轉移方程為:dp[j]=dp[j]+dp[j-1]

dp[n-1]為我們所求解。

**:

class solution:

def uniquepaths(self, m: int, n: int) -> int:

now=[1]*n

for row in range(1,m):

for col in range(1,n):

now[col] = now[col] + now[col-1]

return now[n-1]

空間複雜度o(n)

Leetcode 62 不同路徑

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...

leetcode 62 不同路徑

時間複雜度o n2 def uniquepaths m,n 計算路徑的個數 memo 0 for j in range n for i in range m for i in range m for j in range n if i 0 and j 0 memo i j 1 elif j 0 me...

LeetCode 62 不同路徑

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...