题目
解答:
初始化和特殊情况比较麻烦的dp
obstacleGrid(0,0)=1的,直接return 0即可。入口都被堵住了还怎么走。
m=n=1情况,直接判断
第一行初始化:dp[1][0]->dp[i][0] 碰到有障碍物的,从当前格子开始到末尾全部置0,可以用flag实现,也可以用逻辑与和非实现。列同理
递推:对当前(i,j) 非障碍物时:dp[i][j]=dp[i-1][j]+dp[i][j-1] 有障碍物:dp[i][j]=0 也可以用逻辑去实现
cpp
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if(obstacleGrid[0][0]) return 0;
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>> dp(m,vector<int>(n));
dp[0][0]=1;
if(m==1&&n==1)
return 1;
//初始化第一列
bool flagm=false;
for(int i=1;i<m;i++){
if(obstacleGrid[i][0]||flagm){
flagm=true;
dp[i][0]=0;
}
else {
dp[i][0]=1;
}
}
//初始化第一行
bool flagn=false;
for(int i=1;i<n;i++){
if(obstacleGrid[0][i]||flagn){
flagn = true;
dp[0][i]=0;
}
else{
dp[0][i]=1;
}
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]==1){
dp[i][j]=0;
}
else{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
};
时间复杂度O(mn)
空间复杂度O(mn),也可以优化