leetcode代码记录(不同路径 II

简介: leetcode代码记录(不同路径 II

1. 题目:

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

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

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

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

示例 1:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]

输出:2

解释:3x3 网格的正中间有一个障碍物。

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

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]

输出:1

2. 我的代码:

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:

        m = len(obstacleGrid)
        n = len(obstacleGrid[0])

        # 排除特殊情况
        if obstacleGrid[0][0] == 1 or obstacleGrid[m - 1][n - 1] == 1:
            return 0

        # 定义dp数组
        dp = [[0 for _ in range(n)] for _ in range(m)]

        # 需要让dp[0][0] = 1,为了应对只有一格的情况
        dp[0][0] = 1

        # 初始化dp数组
        # 初始化第一行
        for i in range(1, n):
            if obstacleGrid[0][i] == 0:
                dp[0][i] = 1
            else:
                break

        # 初始化第一列
        for j in range(1, m):
            if obstacleGrid[j][0] == 0:
                dp[j][0] = 1
            else:
                break

        # 遍历
        for m_i in range(1, m):
            for n_i in range(1, n):
                if obstacleGrid[m_i][n_i] == 0:
                    dp[m_i][n_i] = dp[m_i - 1][n_i] + dp[m_i][n_i - 1]
                else:
                    dp[m_i][n_i] = 0

        return dp[m - 1][n - 1]

动态规划最重要最需要理清楚的点:

  1. dp数组及其下标的含义
  2. 递推公式
  3. dp数组初始化
  4. 遍历顺序

这里,通过推理得到:

  1. dp数组下标代表的是第几行第几列位置,dp数组的值代表的是到达该位置的路径的个数
  2. 递推公式,因为只能向右或者向下前进,所以,该位置可以由上面或者左面过来。因此,dp[m_i][n_i] = dp[m_i - 1][n_i] + dp[m_i][n_i - 1]。但是,这里多了障碍物,如果该位置有障碍物,需要设置dp[m_i][n_i]为0,这样别的位置从障碍物这里出发就会加0,也就是没有从障碍物来的路径。
  3. dp数组的初始化,我们至少要初始化第一行和第一列的所有元素,因为要推断其他位置,需要从上和左推断。第一行和第一列的元素还是比较好推断的,比如,第一列的所有元素都应该是1,因为只能从起点出发,一直向左走。从左向右遍历时,如果遇到障碍物,则需要将该位置及其后面的位置都设置为0,因为确实没有能够到达的路径。
  4. 遍历顺序,我们可以一行一行从上到下遍历完,或者一列一列从左到右遍历完,因为需要前面的元素去推断

目录
相关文章
|
1月前
【LeetCode 35】112.路径总和
【LeetCode 35】112.路径总和
24 0
|
1月前
【LeetCode 36】113.路径总和II
【LeetCode 36】113.路径总和II
28 0
|
3月前
|
机器人 Python
【Leetcode刷题Python】62. 不同路径
LeetCode 62题 "不同路径" 的Python解决方案,使用动态规划算法计算机器人从网格左上角到右下角的所有可能路径数量。
69 0
|
1月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
17 0
|
3月前
|
存储 算法 Linux
LeetCode第71题简化路径
文章讲述了LeetCode第71题"简化路径"的解题方法,利用栈的数据结构特性来处理路径中的"."和"..",实现路径的简化。
LeetCode第71题简化路径
|
3月前
|
算法
LeetCode第64题最小路径和
LeetCode第64题"最小路径和"的解题方法,运用动态规划思想,通过构建一个dp数组来记录到达每个点的最小路径和,从而高效求解。
LeetCode第64题最小路径和
|
3月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
42 4
|
3月前
|
存储 Python
【Leetcode刷题Python】滑雪路径消耗时间:Testing Round #16 (Unrated) C. Skier
Leetcode题目"Testing Round #16 (Unrated) C. Skier"的Python解决方案,题目要求计算给定滑雪路径字符串的总耗时,其中未走过的边耗时5秒,走过的边耗时1秒。
54 4
|
3月前
|
存储 Python
【Leetcode刷题Python】1496.判断路径是否相交
Leetcode第1496题"判断路径是否相交"的Python代码实现,通过使用字典存储方向和集合记录访问过的坐标点来检测路径是否与自身相交。
48 2
|
3月前
|
机器人 Python
【Leetcode刷题Python】63. 不同路径 II
LeetCode 63题 "不同路径 II" 的Python解决方案,使用动态规划算法计算在有障碍物的网格中从左上角到右下角的不同路径数量。
24 1