• 63. 不同路径 II


    一个机器人位于一个 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

    提示:

    m == obstacleGrid.length
    n == obstacleGrid[i].length
    1 <= m, n <= 100
    obstacleGrid[i][j] 为 0 或 1

    来源:力扣(LeetCode
    链接:https://leetcode.cn/problems/unique-paths-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思考:题目的关键在于对障碍物的处理,递归的递推公式比较简单,很容易就推到出来,但是对障碍物的特殊处理,障碍物的位置有,在起始位置,在路径终止位置,在第一列边缘位置,在第一行边缘位置,以及在中间位置,前面四个位置需要进行特殊处理,在起始和终止位置,无法到达,所以路径总数为0,在边缘位置的情况,如果出现,那么后面的边缘位置就无法到达,所以后面的边缘位置的路径数量也是0,这样就可以计算出来了,还是考虑的不仔细

    // 使用动态规划进行解决  --- 关键问题是,需要考虑障碍物 在初始化的时候,障碍物位置到达的路径数应该是0,一次来进行障碍物位置处理
    // 1、确定dp数组的含义
    // dp[i][j] 表示 表示到达(i,j)位置一共有多少种路径
    // 2、确定递推公式
    // 如果当前位置有障碍物,那么dp[i][j] = 0;
    // 如果是从当前位置上方位置移动过来的,那么 dp[i][j] = dp[i - 1][j];
    // 如果是从当前位置左侧位置移动过来的,那么 dp[i][j] = dp[i][j - 1];
    // 3、确定初始化
    // 在初始(0,0)位置,有一种方法到达,所以dp[0][0] = 1;
    // 所有边缘位置也都是有一种方法到达, 所以dp[0][j] = 1; dp[i][0] = 1;
    // 如果边缘的一个位置有障碍物,那么障碍物以后的位置都是0 --- 关键一步***
    // 4、确定递推的顺序
    // dp数组是二维数组,所以递推顺序可以从左到右,然后从上到下进行计算
    // 5、确定最后结果获取位置
    // 对于m行n列的网格,最后的结果位置在数组 dp[m-1][n-1]位置
    // 6、进行举例验证
    // obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
    // dp数组
    // 1 1 1 
    // 1 0 1
    // 1 1 2
    // 所以最终结果是 2 中方法
    
    int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
    
        if (obstacleGrid[0][0] == 1 || obstacleGrid[obstacleGridSize - 1][(*obstacleGridColSize) - 1] == 1) return 0; // 如果起始位置和终止位置有障碍物,那么没有办法到达
    
        int** dp = (int**)malloc(sizeof(int*) * obstacleGridSize);
        int i, j;
        for (i = 0; i < obstacleGridSize; i++) {
            dp[i] = (int*)malloc(sizeof(int) * (*obstacleGridColSize));
        }
    
        for (i = 0; i < obstacleGridSize; i++) {
            if (obstacleGrid[i][0] == 1){
                dp[i][0] = 0;
                for (j = i; j < obstacleGridSize; j++) {
                    dp[j][0] = 0;
                }
                break;
            } 
            
            dp[i][0] = 1;
        }
    
        for (i = 0; i < *obstacleGridColSize; i++) {
            if (obstacleGrid[0][i] == 1) {
               dp[0][i] = 0;
                for (j = i; j < *obstacleGridColSize; j++) { // 如果边缘位置有一个有障碍物,后面的边缘位置都无法到达,所以也设置为0
                    dp[0][j] = 0;
                }
                break;
            }
            else dp[0][i] = 1;
        }
    
        for (i = 1; i < obstacleGridSize; i++) {
            for (j = 1; j < (*obstacleGridColSize); j++) {
                if (obstacleGrid[i][j] == 1) {
                    dp[i][j] = 0;
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
    
            }
        }
    
        int ans = dp[obstacleGridSize - 1][(*obstacleGridColSize) - 1];
        for (i = 0; i < obstacleGridSize; i++) {
            free(dp[i]);
            dp[i] = NULL;
        }
        free(dp);
        dp = NULL;
        return ans;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
  • 相关阅读:
    web前段与后端的区别优漫动游
    spring 获取ioc容器,从容器中获取bean
    Java mybatis spring习题
    css文字竖向且英文字母不倒向
    ZoomIt最简单方便的屏幕画图工具操作手册
    java设计模式之策略模式
    NNDL 实验八 网络优化与正则化(4)参数初始化
    基于SSH的网上购书系统设计与实现
    《人人都是提示工程师》读书笔记01.PDF
    实验二.面向对象基础
  • 原文地址:https://blog.csdn.net/weixin_38853761/article/details/127595323