代码随想录算法训练营第三十九天| 62.不同路径 63.不同路径 II

文档讲解:代码随想录

视频讲解:代码随想录B站账号

状态:看了视频题解和文章解析后做出来了

62.不同路径

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[1]*n for _ in range(m)]

        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        
        return dp[m-1][n-1]
  • 时间复杂度:O(m*n)
  • 空间复杂度:O(m*n)

动态规划五部曲:

1. 确定dp数组以及下标的含义:dp[i][j] 为遍历到此位置的不同路径数量

2. 确定递推公式:因为人物只能向右和下移动,所以当前位置的路径数量是由它左边和上边位置上的路径数量汇总得到的。

dp[m][n] = dp[m-1][n] + dp[m][n-1]

3. dp数组初始化:因为初始位置,以及初始位置所在的十字区间内的路径数量都是1,所以定义一个初始化都为1的二维数组,数组的dimension为m*n。

4. 确定遍历顺序:因为我们需要m-1行(上一行)的路径数量做计算,所以先从m维度来遍历来获取到m-1行的值。

遍历的起始点都是1,因为起始点十字区间内其实都是只有一种路径达到的。

5. 举例推导dp数组:

m=3, n=2

dp[m][n] = [[1,1], [1,2], [1,3]]

代码随想录算法训练营第三十九天| 62.不同路径 63.不同路径 II_第1张图片

 

63.不同路径 II

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        width = len(obstacleGrid)
        length = len(obstacleGrid[0])

        # obstacle at starting point or ending point
        if obstacleGrid[width - 1][length - 1] == 1 or obstacleGrid[0][0] == 1:
            return 0

        # initialize with 0
        dp = [[0] * length for _ in range(width)]
        
        # initialize dp according to obstacleGrid
        for i in range(width):
            if obstacleGrid[i][0] == 1:
                break
            dp[i][0] = 1

        for i in range(length):
            if obstacleGrid[0][i] == 1:
                break
            dp[0][i] = 1

        # Begin looping
        for i in range(1, width):
            for j in range(1, length):
                if obstacleGrid[i][j] == 1:
                    continue
                dp[i][j] = dp[i-1][j] + dp[i][j-1]

        return dp[width-1][length-1]
  • 时间复杂度:O(m*n)
  • 空间复杂度:O(m*n)

动态规划五部曲:

与上一题相比,只有dp数组初始化有不同:

3. dp数组初始化:首先初始化一个二维dp数组,并全部赋值为0。因为这道题引入了障碍物的概念,所以在初始化起始位置的十字区间内就不能盲目地初始化为1了。

用两个for循环分别循环第一行和第一列,如果没遇到obstacle赋值1,没遇到直接break。break是因为这个obstacle阻挡了后面所有位置的路径,它们都是0。

之后循环的时候,遇到obstacle直接continue,不去计算它左边和上边的总和。

5. 举例推导dp数组:

m=3, n=3

obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]

dp[m][n] 如下图

代码随想录算法训练营第三十九天| 62.不同路径 63.不同路径 II_第2张图片

你可能感兴趣的:(算法,leetcode,职场和发展)