1、由于它有障碍,并且障碍在数组中表示为1,那么我们可以用每个格obstacleGrid[i][j]去存储走到当前格的路径数加一,那么要得到路径数,只要将格子中的数减一即可,而有障碍的格子中的数为1,减去1则为0,所以不再影响递推的结果。
先初始化第一行和第一列,从开始位置到遇到边界或者遇到障碍之间的格子都填充2,因为只能往右往上走,所以都只有一条路径到达这里,如果遇到障碍,那么障碍后的所有格子填充1,表示到达这些格子的路径数为0;
然后根据状态转移方程:obstacleGrid[i][j]=obstacleGrid[i-1][j]+obstacleGrid[i][j-1]-1;
这里要注意,如果obstacleGrid[i][j]为1,也就是说该格子为障碍物,不用更新。
还有由于每个格子都表示为所能到达的路径数加一,所以当将上一个格子和左一个格子相加时,就同时加了两次一,所以需要减去一,才是当前格子的路径数加一。
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if(obstacleGrid[0][0]==1) return 0;
int row=obstacleGrid.size();
int col=obstacleGrid[0].size();
obstacleGrid[0][0]=2;
for(int i=1;i<col;++i)
if(!obstacleGrid[0][i])obstacleGrid[0][i]=obstacleGrid[0][i-1];
for(int i=1;i<row;++i)
if(!obstacleGrid[i][0])obstacleGrid[i][0]=obstacleGrid[i-1][0];
for(int i=1;i<row;++i)
for(int j=1;j<col;++j)
if(!obstacleGrid[i][j])
obstacleGrid[i][j]=obstacleGrid[i-1][j]+obstacleGrid[i][j-1]-1;
return obstacleGrid[row-1][col-1]-1;
}
};