採用動態規劃解決。
設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<m,1<=j<n)
代碼:
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)