63. 不同路径 II
https://leetcode-cn.com/problems/unique-paths-ii/
解法一:回溯(超时)
先递归右边块,再递归下方块,遇到1则终止返回,若能到达终点,路径数+1.
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
self.count = 0 #全局变量,记录路径总数
m, n = len(obstacleGrid), len(obstacleGrid[0])
#边界条件,由于只对右边和下方块检测,对(0,0)块没有检测,若该块有路障,直接返回
if obstacleGrid[0][0] == 1:
return self.count
self.travel(obstacleGrid, 0, 0, m, n)
return self.count
def travel(self, obstacleGrid, row, col, m, n): #递归函数
#下标越界或遇到障碍
if row >= m or col >= n or obstacleGrid[row][col] == 1:
return
if row == m-1 and col == n-1: #到达终点,路径+1
self.count += 1
self.travel(obstacleGrid, row, col+1, m, n) #递归右侧
self.travel(obstacleGrid, row+1, col, m, n) #递归下方解法二:dp
遍历棋盘,若(i, j)位置为路障‘1’,直接将dp[i][j]置为0,表示此路不通,其余同62.不同路径 的dp,方程为dp[i][j] = dp[i-1][j] + dp[i][j-1]。
边界:第一行和第一列,包括最左上角(0, 0)。若(0, 0)为0,则dp[0][0]=1,否则dp[0][0]=0
2020.3.29
最后更新于