115. 不同的路径 II
"不同的路径" 的跟进问题:
现在考虑网格中有障碍物,那样将会有多少条不同的路径?
网格中的障碍和空位置分别用 1 和 0 来表示。
样例
如下所示在3x3的网格中有一个障碍物:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
一共有2条不同的路径从左上角到右下角。
注意事项
m 和 n 均不超过100
解题思路:这个题目的解题思路跟不同路径Ⅰ的解题思路是一样的,这个题目中增加了障碍物后,需要注意二维数组的赋值。当障碍物出现在第一行或者第一列的时候,后面的路就走不通了。
代码:
public class Solution {
/**
* @param obstacleGrid: A list of lists of integers
* @return: An integer
*/
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
// write your code here
if(obstacleGrid.length == 0||obstacleGrid[0].length == 0)
return 0;
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
for(int i=0;i<m;i++){
if(obstacleGrid[i][0] == 1)
break;
dp[i][0] = Math.abs(obstacleGrid[i][0] - 1);
}
for(int i=0;i<n;i++){
if(obstacleGrid[0][i] == 1)
break;
dp[0][i] = Math.abs(obstacleGrid[0][i] - 1);
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j] == 1)
continue;
dp[i][j]= dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
}
同样的,为了节省空间,将二维数组改为一维数组:
public class Solution {
/**
* @param obstacleGrid: A list of lists of integers
* @return: An integer
*/
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
// write your code here
if(obstacleGrid.length == 0||obstacleGrid[0].length == 0)
return 0;
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
/*int[][] dp = new int[m][n];
for(int i=0;i<m;i++){
if(obstacleGrid[i][0] == 1)
break;
dp[i][0] = Math.abs(obstacleGrid[i][0] - 1);
}
for(int i=0;i<n;i++){
if(obstacleGrid[0][i] == 1)
break;
dp[0][i] = Math.abs(obstacleGrid[0][i] - 1);
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j] == 1)
continue;
dp[i][j]= dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];*/
int[] dp = new int[n];
for(int i=0;i<n;i++){
if(obstacleGrid[0][i] == 1)
break;
dp[i] = Math.abs(obstacleGrid[0][i] - 1);
}
for(int i=1;i<m;i++){
for(int j=0;j<n;j++){
if(obstacleGrid[i][j] == 1){
dp[j] = 0;
continue;
}
if(j>0)
dp[j]+=dp[j-1];
}
}
return dp[n-1];
}
}