• 不同路径II(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。)


    示例 1:

    输入:
    [
      [0,0,0],
      [0,1,0],
      [0,0,0]
    ]
    输出: 2
    解释:
    3x3 网格的正中间有一个障碍物。
    从左上角到右下角一共有 2 条不同的路径:
    1. 向右 -> 向右 -> 向下 -> 向下
    2. 向下 -> 向下 -> 向右 -> 向右

    思路分析这个问题和上一篇路径题的分析一样,不同之处在于,加了障碍物。那么我们可以重新定义一个二维数组,用来返回路径数,具体思路见代码注释。
    public static int uniquePathsWithObstacles(int[][] arr) {
            int m = arr.length;
            int n = arr[0].length;
            //如果起始位置和终点位置为1,直接返回0
            if(arr[0][0] == 1 || arr[m-1][n-1] == 1) return 0;
            //如果m == 1,判断第m-1行是不是有1,有1直接返回0,否则返回1
            if(m == 1) {
                for(int j = 1;j<n;j++) {
                    if(arr[0][j] == 1) 
                        return 0;
                }
                return 1;
            }
            //如果n == 1,判断第n-1列是不是有1,有1直接返回0,否则返回1
            if(n == 1) {
                for(int i = 1;i < m;i++) {
                    if(arr[i][0] == 1) 
                        return 0;
                }
                return 1;
            }
            //定义和输入数组arr一样大小的数组,作为判断
            int[][] array = new int[m][n];
            for(int j = 1;j<n;j++) {
                //判断arr[0][j]是否等于1,如果不等于1,那么array[0][j]等于0,如果等于1,
                //从j列开始到j<n,array[0][j]全部赋值为0
                if(arr[0][j] == 0) {
                    array[0][j] = 1;
                }else {
                    for(int k = j;k<n;k++) {
                        array[0][k] = 0;
                    }
                    break;
                }
            }
            
            for(int i = 1;i<m;i++) {
                //判断arr[i][0]是否等于1,如果不等于1,那么array[i][0]等于0,如果等于1,
                //从i行开始到i<m,array[i][0]全部赋值为0
                if(arr[i][0] == 0) {
                    array[i][0] = 1;
                }else {
                    for(int k = i;k<m;k++) {
                        array[k][0] = 0;
                    }
                    break;
                }
            }
            
            
            for(int i = 1;i<m;i++) {
                for(int j = 1;j<n;j++) {
                    //如果arr[i][j] == 1,array = 0,否则array[i][j] = array[i-1][j] + array[i][j - 1]
                    if(arr[i][j] == 0) {
                        array[i][j] = array[i-1][j] + array[i][j - 1];
                    }
                }
            }
            //返回数组array最后一个数
            return array[m-1][n-1];
        }
     
  • 相关阅读:
    Windows 之 CMD命令
    关于生sql中的空值
    电商物流仓储WMS业务流程
    VS 在代码中括号总是跟着类型后面
    DataTable的Select()方法
    sqlserver 系统表芝士
    CodeMix入门基础知识
    DevExpress v18.1新版亮点——CodeRush for VS篇(二)
    DevExpress v18.1新版亮点——CodeRush for VS篇(一)
    DevExpress v18.1新版亮点——Data Access篇
  • 原文地址:https://www.cnblogs.com/du001011/p/10481043.html
Copyright © 2020-2023  润新知