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

LeetCode 62. 不同路径
题目链接:62. 不同路径 - 力扣(LeetCode)

每道题都要考虑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]
/java
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] mat = new int[m][n];
        for(int i = 0; i < m; i++){
            mat[i][0] = 1;
        }
        for(int i = 0; i < n; i++){
            mat[0][i] = 1;
        }
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                mat[i][j] = mat[i - 1][j] + mat[i][j - 1];
            }
        }
        return mat[m - 1][n - 1];
    }
}

LeetCode 63. 不同路径 II
题目链接:63. 不同路径 II - 力扣(LeetCode)

每道题都要考虑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]  //返回最后一个位置,得到这过程中所有可能的路径
/java
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length, n = obstacleGrid[0].length;
        int[][] mat = new int[m][n];

         // 初始化第一列,如果有障碍物则后续都为0  
        for (int i = 0; i < m && obstacleGrid[i][0] != 1; i++) {  
            mat[i][0] = 1;  
        }  
          
        // 初始化第一行,如果有障碍物则后续都为0  
        for (int j = 0; j < n && obstacleGrid[0][j] != 1; j++) {  
            mat[0][j] = 1;  
        }  
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(obstacleGrid[i][j] == 1){
                    mat[i][j] = 0;
                }
                else{
                    mat[i][j] = mat[i - 1][j] + mat[i][j - 1];
                }
            }
        }
        return mat[m - 1][n - 1];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别看了真C不了一点

打赏者皆为义父

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值