题目
这题在leedcode 62题上增加了一个条件,在格网中添加障碍物。
解析
- 添加障碍物之后,其实我们只需要将最后一排与最右边一列的每个格子的路径和判断清除就好了。
- 在没有障碍物时,路径和都是1
- 有障碍物之后,那么最后一排和最右边一列中,只要某个格子为1,那么这个格子前面的格子的路径和都为0。
- 其他位置的格子的路径和依旧像上一题那样求解。即
dp[i][j] = dp[i][j] = dp[i+1][j] + dp[i][j+1]
代码:
public static int uniquePathsWithObstacles(int[][] obstacleGrid) {
int row = obstacleGrid.length;
int col = obstacleGrid[0].length;
int[][] dp = new int[row][col];
// 先把最后一排与最右边一列格子的路径和计算出来
for(int k = col-1;k >= 0; k--) {
if(obstacleGrid[row-1][k] == 1) {
break;// 如果最后一排有一个位置为1,则它前面的所有格子路径和都为0
}else{
dp[row-1][k] =1;
}
}
for(int m = row-1;m >= 0;m--) {
if(obstacleGrid[m][col-1] == 1) {
break;// 如果最后一排有一个位置为1,则它前面的所有格子路径和都为0
}else{
dp[m][col-1] =1;
}
}
for(int i = row-2;i>=0;i--) {
for(int j = col-2;j>=0;j--) {
if(obstacleGrid[i][j] == 0) {
if(i == row -1 || j == col -1) {
dp[i][j] = 1;
}else {
dp[i][j] = dp[i+1][j] + dp[i][j+1];
}
}
}
}
return dp[0][0];
}