leetcode 63.不同路径II

思路:动态规划

这一道题是对于有障碍物的时候怎么计算路径条数的题。

其实和第一道很一样,都是对于边界初始化,对于dp的状态方程也是一样的。

但是,对于有障碍物的话,需要有一点变动。

我们思考一下,障碍物的位置会在哪里:

1.它可以是在边界处,也就是在最上面或者最左边。这样的话在障碍物前面的方格都是有路的,但是,在障碍物后面的路是不是就是0条了?因为没有一条路可以是向下或者向右走而到达那里的,如果可以到达,只能是向上走或者向左走,这显然不是符合题目的。所以这里在初始化的时候需要注意。

2.如果障碍物不在边界处呢?这就需要我们在dp数组里面提前标注了,这个时候这个方格是没有路的,也就是dp=0.但是,这个时候其他还没有转变状态的方格dp该怎么办呢?因为初始化的时候dp的值都是0.我们可以让dp为别的值,用正数的话可能会有数据冲突,我们选择负数,直接初始化为-1就行了。

3.障碍物会有多少个呢?这里题目并没有说明,这个说不定,所以可能是1个也可能是多个,我们需要一个一个判断,这一点切记不要忘记。

注意的点说完了,上代码,代码的注释会详细说明。

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int n=obstacleGrid.size();
        int m=obstacleGrid[0].size();
        if(obstacleGrid[0][0]==1)//起点就有障碍物,就不会走到终点。
        return 0;
        
        vector<vector<int>>dp(n+1,vector<int>(m+1,-1));//dp数组初始化为-1
        int index1=-1;//记录有障碍物的x坐标
        int index2=-1;//记录有障碍物的y坐标
        
        for(int i=1;i<=n;i++)
        dp[i][1]=1;
        for(int i=1;i<=m;i++)
        dp[1][i]=1;//以上为初始化边界
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(obstacleGrid[i][j]==1){//发现障碍物
                    index1=i;
                    index2=j;
                    if(index1==0){//边界判断
                       int j=index2+1;
                       while(j<=m){
                          dp[index1+1][j++]=0;//由于在障碍物后面的方格都不会到达,所以循环找
                                  }
                                }
                    else if(index2==0){//边界判断
                        int j=index1+1;
                        while(j<=n)
                            dp[j++][index2+1]=0;//同上面的操作一样的道理
                            }
                    else
                        dp[index1+1][index2+1]=0;//除了边界以外
            }
        }
    }
        for(int i=2;i<=n;i++){
            for(int j=2;j<=m;j++){
                if(dp[i][j]==0)
                continue;
                else
                dp[i][j]=dp[i-1][j]+dp[i][j-1];//状态转移方程
            }
        }
        
        return dp[n][m];
    }
};

相关推荐

  1. leetcode 63.不同路径II

    2024-03-31 18:20:04       43 阅读
  2. Leetcode63- 不同路径II

    2024-03-31 18:20:04       40 阅读
  3. LeetCode63题 - 不同路径 II

    2024-03-31 18:20:04       66 阅读
  4. 动态规划 Leetcode 63 不同路径II

    2024-03-31 18:20:04       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 18:20:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 18:20:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 18:20:04       82 阅读
  4. Python语言-面向对象

    2024-03-31 18:20:04       91 阅读

热门阅读

  1. Node.js常用命令

    2024-03-31 18:20:04       41 阅读
  2. 高防IP是怎样抵御攻击的?

    2024-03-31 18:20:04       37 阅读
  3. 让Android应用活起来: Retrofit 和 OkHttp的比较参考

    2024-03-31 18:20:04       42 阅读
  4. ZooKeeper 宕机如何应对

    2024-03-31 18:20:04       43 阅读
  5. Gitea的简单介绍

    2024-03-31 18:20:04       36 阅读
  6. P8709 [蓝桥杯 2020 省 A1] 超级胶水

    2024-03-31 18:20:04       39 阅读
  7. zookeeper--ACL详解

    2024-03-31 18:20:04       40 阅读
  8. perl:字符串模糊匹配,计算 edit 距离

    2024-03-31 18:20:04       37 阅读
  9. linux 系列文章目录 - 打包压缩命令之tar命令

    2024-03-31 18:20:04       39 阅读
  10. OSPF与静态路由配置实验介绍

    2024-03-31 18:20:04       39 阅读
  11. 二叉树的遍历C语言

    2024-03-31 18:20:04       46 阅读
  12. 【PySide6】PySide6安装及VSCode配置PySide6环境

    2024-03-31 18:20:04       43 阅读