1. 程式人生 > 實用技巧 >leetcode刷題-62不同路徑

leetcode刷題-62不同路徑

題目

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

問總共有多少條不同的路徑?

思路

回溯:能夠實現,不斷向右或者向下,但是效率過低,無法通過

動態規劃:

令 dp[i][j] 是到達 i, j 最多路徑,因此動態方程為dp[i][j] = dp[i-1][j] + dp[i][j-1],其中第一行 dp[0][j]和第一列 dp[i][0],在邊界,所以其值只能為 1、

進一步優化:每一格的值只與上一行有關,因此我們只要維護一行的值即可

實現

回溯:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        result = 0
        def step(x,y):
            if x < m-1:
                step(x+1,y)
            if y < n-1:
                step(x,y+1)
            if x == m -1 and y == n-1:
                nonlocal result
                result 
+= 1 step(0,0) return result

動態規劃:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        matrix = [[0 for i in range(n)] for j in range(m)]
        for k in range(m):
            for j in range(n):
                if k < 1:
                    matrix[k][j] = 1
                elif
j < 1: matrix[k][j] = 1 else: matrix[k][j] = matrix[k-1][j] + matrix[k][j-1] return matrix[m-1][n-1]

優化:

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        matrix = [1 for i in range(n)]
        for k in range(1,m):
            for j in range(1,n):
                    matrix[j] += matrix[j-1]
        return matrix[n-1]