base case分析
- 当第一行或第一列出现1的时候,剩余的列或行就可以赋值为0
- 迭代时只需要算没有障碍的位置
- 有障碍的位置提前赋值为0
- dp[i][j]表示从左上角(0,0)到(i,j)处的路径总数
- dp[i][j]=dp[i-1][j]+dp[i][j-1]
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int row=obstacleGrid.length;
int col=obstacleGrid[0].length;
int[][] dp=new int[row][col];
//提前将障碍位置赋值为0
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(obstacleGrid[i][j]==1){
dp[i][j]=0;
}
}
}
//base case:第一行某列有障碍,该列之后的列都需要赋值为0;同理分析第一列
for(int i=0;i<row;i++){
dp[i][0]=1;
if(obstacleGrid[i][0]==1) {
while(i<row) {
dp[i][0]=0;
i++;
}
break;
}
}
for(int i=0;i<col;i++){
dp[0][i]=1;
if(obstacleGrid[0][i]==1) {
while(i<col) {
dp[0][i]=0;
i++;
}
break;
}
}
// 迭代过程中只用考虑没有障碍的位置,如果障碍位置也考虑,则会出错
// 由于第一行和第一列提前考虑了,所以从1开始
for(int i=1;i<row;i++){
for(int j=1;j<col;j++){
if(obstacleGrid[i][j]!=1){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[row-1][col-1];
}
}