leetcode ---62不同路徑

採用動態規劃解決。

設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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章