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]