不同路径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];
    }
 

猜你喜欢

转载自www.cnblogs.com/duy666/p/10481043.html