与62的区别在于,本题有障碍物
开始,就想在62的基础上实现,认为将不考虑障碍的情况,减去经过障碍的情况即可,但提交时,提示解答错误,原因是,当有多个障碍时,可能有情况被多减了。
下附错误的代码
class Solution {
public:
int uniquePaths(int m, int n) {
long long numerator=1,denominator=1,times=min(m-1,n-1),i;
for(i=0;i<times;i++)
{
numerator=numerator*(m+n-2-i);
denominator=denominator*(i+1);
}
return numerator/denominator;
}
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
long long m=obstacleGrid.size(),n=obstacleGrid[0].size(),ans=0,i,j;
ans=uniquePaths(m,n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(obstacleGrid[i][j])
ans=ans-uniquePaths(i+1,j+1)*uniquePaths(m-i,n-j);
return ans;
}
};
后来,采用动态规划来实现,求到达每一个位置的方案。当当前位置不是障碍时,方案数等于左边位置的方案数+上一个位置的方案数。若当前位置有障碍,则置为0
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m=obstacleGrid.size(),n=obstacleGrid[0].size(),i,j,ans=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(obstacleGrid[i][j]==1)
ans=obstacleGrid[i][j]=0;
else
{
if(i>0 && j>0) ans=obstacleGrid[i][j]=obstacleGrid[i-1][j]+obstacleGrid[i][j-1];
else if(i>0) ans=obstacleGrid[i][j]=obstacleGrid[i-1][j];
else if(j>0) ans=obstacleGrid[i][j]=obstacleGrid[i][j-1];
else ans=obstacleGrid[i][j]=1;
}
return ans;
}
};