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

LeetCode 62. 不同路径
题目链接:62. 不同路径 - 力扣(LeetCode)代码随想录算法训练营第三十九天| 62. 不同路径、63. 不同路径 II_第1张图片

每道题都要考虑dp五步:

便于理解,处于菜鸟阶段,乖乖地使用二维数组来实现

1)确定dp数组下标与值的关系:当前位置存在的可能路径

2)确定递推公式:要么上边来的,要么左边来的

3)确定初始值:dp[0][0] == 1,第一行第一列的都要初始为1

4)确定遍历的数:第二行、第二列开始

5)带入验证一下

代码:

#python
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0 for _ in range(n)] for _ in range(m)]
        dp[0][0] = 1  //注意初始化为1
        for i in range(m):
            dp[i][0] = 1    //初始化第一列
        for i in range(n):  
            dp[0][i] = 1   //初始化第一行
        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]

LeetCode 63. 不同路径 II
题目链接:63. 不同路径 II - 力扣(LeetCode)代码随想录算法训练营第三十九天| 62. 不同路径、63. 不同路径 II_第2张图片

每道题都要考虑dp五步:

该题在上一道题的基础上,增加了障碍物,用原始数组的1来表示,所以我们要增加这样的考虑,被堵住了就不能再用了

1)确定dp数组下标与值的关系:当前位置存在的可能路径

2)确定递推公式:要么上边来的,要么左边来的

3)确定初始值:dp[0][0] == 1,第一行第一列的都要初始为1,注意判断一下初始位置与结束位置是否存在障碍物,存在则直接返回0(即是不可到达)

4)确定遍历的数:第二行、第二列开始

5)带入验证一下

代码:

#python
class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m, n =len(obstacleGrid), len(obstacleGrid[0])  //简化一下,不然太复杂
        if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1: //判断端点情况
            return 0
        dp = [[0 for _ in range(n)] for _ in range(m)] //初始化dp数组
        dp[0][0] = 1 //赋值为1
        for i in range(1, m):
            if obstacleGrid[i][0]:   //如果遇到障碍物了,跳出当前循环了,走不了了
                break
            else:
                dp[i][0] = dp[i - 1][0]
        for i in range(1, n):      //同上的思路
            if obstacleGrid[0][i]:
                break
            else:
                dp[0][i] = dp[0][i - 1]
        for i in range(1, m):  
            for j in range(1, n):
                if obstacleGrid[i][j]:   //有障碍物就算了,不赋值了
                    continue
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1]  //否则我们赋值,注意就算上方或者左方有障碍物也没关系的,因为其dp值为0,不影响
        return dp[m - 1][n - 1]  //返回最后一个位置,得到这过程中所有可能的路径

你可能感兴趣的:(算法)