此题也是要用动态规划,可以参照 LeetCode-62. 不同路径——动态规划入门
但这里要注意,如果起点就有障碍物的话,那么根本到不了终点。同样的,如果只有一行或一列的话,但中间存在障碍物的话,那么也是到达终点的。也就是说,我们在设置第一行第一列中的dp值时不仅要判断当前位置是否有障碍物,同时也要判断前面的值是否存在障碍物,这里我们可以当判断出当前位置没障碍物直接将上一次的结果赋值到当前值中即可
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int row = obstacleGrid.length;
int column = obstacleGrid[0].length;
int[][] dp = new int[row][column];
for(int i=0;i<row;i++){
for(int j=0;j<column;j++){
if(i==0&&j==0){
//如果起点没有障碍的话则设置为1
if(obstacleGrid[i][j]!=1){
dp[i][j]=1;
}
//如果起点就要障碍,无论网格有多大,都到不了终点
continue;
}
//列
if(i==0&&j!=0){
//要判断当前有没有障碍,同时也要考虑上一个有没有障碍
if(obstacleGrid[i][j]!=1){
dp[i][j]=dp[i][j-1];
}
continue;
}
//行
if(i!=0&&j==0){
if(obstacleGrid[i][j]!=1){
dp[i][j]=dp[i-1][j];
}
continue;
}
if(obstacleGrid[i][j]!=1){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[row-1][column-1];
}
}