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

最后更新于