leetcode刷題-62不同路徑
阿新 • • 發佈:2020-08-06
題目
一個機器人位於一個 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 elifj < 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]