63. Unique Paths II

题目描述

这是“不同路径” 的进阶问题:

现在考虑网格中有障碍物。那样将会有多少条不同的路径从左上角到右下角?

网格中的障碍物和空位置分别用 10 来表示。

例如,

如下所示在 3x3 的网格中有一个障碍物。

[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]

一共有 2 条不同的路径从左上角到右下角。

注意: mn 的值均不超过 100。有障碍物的位置,过来的路径数为0(真坑,原题这里没说)。

我的解法——DP(AC)

  • 每个格子可能从上面、左面走下来:dp[i]/[j] = dp[i - 1]/[j] + dp[i]/[j - 1]
  • 注意:就是第0行和第0列。如果没有障碍物,所有路径都是1,但是如果有障碍物。从第一个有障碍物开始,这一排和这一列以后的所有路径是0,就是以后的地方都到不了。。
  • 注意:dp数组初始要设置为0,不是-1了
  • 复杂度O(n2)
  • 结果:Beat22.24%
class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m = len(obstacleGrid)
        n = len(obstacleGrid[0]) if(len(obstacleGrid) != 0) else 0
        dp = [[0 for j in range(n)] for i in range(m)]  # 注意:初始要设置为0,不是-1了
        if(obstacleGrid[0][0] == 0):
            dp[0][0] = 1

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