【动态规划】leetcode63.不同路径II

题目:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
【动态规划】leetcode63.不同路径II_第1张图片
【动态规划】leetcode63.不同路径II_第2张图片

解答:

方法一:动态规划

时间复杂度:O(mn)
空间复杂度:O(m
n)

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m=len(obstacleGrid)
        n=len(obstacleGrid[0])
        dp=[[0]*n for _ in range(m)]
        for i in range(m):
            if obstacleGrid[i][0]==1:
                break
            else:
                dp[i][0]=1
        
        for j in range(n):
            if obstacleGrid[0][j]==1:
                break
            else:
                dp[0][j]=1

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

方法二:优化

时间复杂度:O(m*n)
空间复杂度:O(n)

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m=len(obstacleGrid)
        n=len(obstacleGrid[0])
        dp=[0]*n
        
        for j in range(n):
            if obstacleGrid[0][j]==1:
                break
            else:
                dp[j]=1
        
        for i in range(1,m):
            # 从第一列开始,因为第一列可能有障碍物
            for j in range(n):
                if obstacleGrid[i][j]==1:
                    dp[j]=0
                elif j>0:
                    dp[j]+=dp[j-1]
        return dp[n-1]

你可能感兴趣的:(编程,leetcode,动态规划,leetcode,算法)