41

不同路径 II

·2 分钟

🟡 Medium · 🏷️ 数组、动态规划 · LeetCode#63

📖 题目

不同路径一样的网格,但某些格子是障碍物(值为1),机器人不能经过,求到右下角的路径数。

💡 思路

骨架跟不同路径完全一样,只是每个格子多判断一句:是障碍物就直接是 0,不参与转移。

第一行/第一列比较微妙:一旦某处遇到障碍物,从它往后(同一行/列)全都不可达了——因为 dp[i][0] = dp[i-1][0](等于前一格),前一格一旦是 0,后面全部跟着是 0,这个"堵死"效果会自然沿着边界传递下去,不用额外处理。

💻 代码

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m, n = len(obstacleGrid), len(obstacleGrid[0])
        dp = [[0] * n for _ in range(m)]
        dp[0][0] = 1 - obstacleGrid[0][0]   # 起点本身有障碍就是 0

        for i in range(1, m):
            dp[i][0] = dp[i - 1][0] if obstacleGrid[i][0] == 0 else 0
        for j in range(1, n):
            dp[0][j] = dp[0][j - 1] if obstacleGrid[0][j] == 0 else 0

        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1] if obstacleGrid[i][j] == 0 else 0

        return dp[-1][-1]

时间复杂度 O(m × n),空间复杂度 O(m × n)。