採用動態規劃解決。
設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。示例 ...