和62题差不多,顺便也做了吧。。题目如下:
这是“不同路径” 的进阶问题:
现在考虑网格中有障碍物。那样将会有多少条不同的路径从左上角到右下角?
网格中的障碍物和空位置分别用 1
和 0
来表示。
例如,
如下所示在 3x3 的网格中有一个障碍物。
[ [0,0,0], [0,1,0], [0,0,0] ]
一共有 2
条不同的路径从左上角到右下角。
注意: m 和 n 的值均不超过 100。
下面我们首先分析一下这个题目:如图,如果有障碍物(黄色)的地方走不了,也就是去此地的路径个数是0。需要注意的是,如果障碍物在第一行或者第一列的情况,如果障碍物在第一行,那么第一行中障碍物之后的列的路径个数都是0,如果障碍物在第一列的话也是一样的道理。同62题一样,也有(m,n)= (m-1,n)+(m,n-1)。那么我们画个示例图,如下所示(数字代表到此方块的路径的总数):
这样我们就可以把代码撸出来了,如下:
public class LeetCode63 {
public static int uniquePathsWithObstacles(int[][] obstacleGrid) {
int[][] resultArray = new int[obstacleGrid.length][obstacleGrid[0].length];
for (int i = 0; i<obstacleGrid.length; i++) {
if (obstacleGrid[i][0] != 1) {
resultArray[i][0] = 1;
}
else {break;}
}
for(int j = 0; j<obstacleGrid[0].length; j++) {
if (obstacleGrid[0][j] != 1) {
resultArray[0][j] = 1;
}
else {break;}
}
for (int i = 1; i<obstacleGrid.length; i++) {
for(int j = 1; j<obstacleGrid[0].length; j++) {
if(obstacleGrid[i][j] == 1) {
resultArray[i][j] = 0;
}
else {
resultArray[i][j] = resultArray[i-1][j] + resultArray[i][j-1];
}
}
}
return resultArray[obstacleGrid.length-1][obstacleGrid[0].length-1];
}
public static void main(String[] args) {
int[][] test = {{0, 1, 0, 0, 0}, {0,0,0,1,0}, {0,0,0,0,0}};
System.out.println(uniquePathsWithObstacles(test));
}
}