Leetcode - 63の異なる経路IIのPython

免責事項:この記事は、オリジナルである、すべての権利予約https://blog.csdn.net/weixin_41864878/article/details/90520331

左コーナーMXNグリッドに位置ロボットは(以下、「スタート」と表示されたポイントのフィギュアを開始します)。

ロボットは右または下に一歩を移動することができます。(「完了」と表示され、次の図の)グリッドの右下隅に到達しようとしているロボット。

今すぐグリッドの障害物を考慮してください。だから、どのように多くの異なるパス左上から右下にあるでしょうか?

空のグリッド位置と、それぞれ1と0が表現する障害。

説明:M及びnの値100以下です。

例1:

入力:[[0,0,0]、[0,1,0]、[0,0,0]]出力:2説明:3x3のグリッド障害の真ん中。
左上から2つの異なるパスの合計の右下隅に:

  1. 右 - >右 - >下 - >ダウン
  2. ダウン - >ダウン - >右 - >右

そこに多くの境界条件は、次に62内に取り込まは異ならない
:基本的な方程式
ではない障害、ステップ[I] [J] [J] +工程[I] [J-1]は[I-1] =ステップ
であります障害、ステップ[I] [J] = 0

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        if not obstacleGrid: return 0
        if obstacleGrid[len(obstacleGrid)-1][len(obstacleGrid[0])-1]: return 0 #如果右下角是个障碍物那么就不能到达,返回0
        if len(obstacleGrid) == len(obstacleGrid[0]) == 1: return 1 #只有起始点(这里题目好像默认起始点不会是障碍点的)
        
        #初始矩阵的构建,非常重要,这里全部要按零初始化,第一行或者第一列出现障碍物后,后面的值要全部都是0
        step = [[0 for i in range(len(obstacleGrid[0]))] for j in range(len(obstacleGrid))]
        for i in range(len(obstacleGrid[0])):
            if not obstacleGrid[0][i]:
                step[0][i] = 1
            else:
                if len(obstacleGrid) == 1: return 0  #如果是单行,出现障碍物,不能到达
            	break
        for i in range(len(obstacleGrid)):
            if not obstacleGrid[i][0]:
                step[i][0] = 1
            else: 
            	if len(obstacleGrid[0]) == 1: return 0
            	break
            
        #标准动规   
        for i in range(1, len(obstacleGrid)):
            for j in range(1, len(obstacleGrid[0])):
                step[i][j] = step[i-1][j] + step[i][j-1] if not obstacleGrid[i][j] else 0
        return step[len(obstacleGrid)-1][len(obstacleGrid[0])-1] 

おすすめ

転載: blog.csdn.net/weixin_41864878/article/details/90520331