一,问题描述
二,问题分析
此题的难点在于有了障碍物,但是核心的递推公式和62.不同路径是一致的,但是需要考虑的条件更多
1.如果起点有障碍物,那么就没有路径可以走,返回0
2.对于第一行,如果如果有一个格点初始值为
1
,说明当前节点有障碍物,没有路径可以通过,设值为0,否则
dp[0][i] = dp[0][i - 1]3.第一列同理
4.状态转移方程需要充分考虑所有情况
4.1如果(i,j)位置的上方有障碍物,则(i,j)只能从左边来
4.2如果(i,j)位置的左边有障碍物,则(i,j)只能从上边来
4.3如果(i,j)位置的上边和左边都有障碍物,则没有路径可以来
4.4如果(i,j)位置的上边和左边都没有障碍物,则62.不同路径递归公式一致
4.5如果(i,j)位置本身就是障碍物,则同样没有路径
三,问题解答
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(); //矩阵行数
int n = obstacleGrid[0].size(); //矩阵列数
if(obstacleGrid[0][0]==1){
return 0;
}
vector<vector<long long>> dp(m,vector<long long>(n,0)); //int类型会有测试用例超出范围
dp[0][0] = 1;
for(int i=1;i<m;i++){
if(obstacleGrid[i][0] == 1){
dp[i][0] = 0;
}else dp[i][0] = dp[i - 1][0];;
}
for(int i=1;i<n;i++){
if(obstacleGrid[0][i] == 1){
dp[0][i] = 0;
}else dp[0][i] = dp[0][i - 1];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]==1){//如果本身就是障碍点,为0
continue;
}
if(obstacleGrid[i-1][j]==0 &&obstacleGrid[i][j-1]==0){
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}else if(obstacleGrid[i-1][j]==0 && obstacleGrid[i][j-1]!=0){
dp[i][j] = dp[i-1][j];
}else if(obstacleGrid[i-1][j]!=0 && obstacleGrid[i][j-1]==0){
dp[i][j] = dp[i][j-1];
}else{
dp[i][j] = 0;
}
}
}
return dp[m-1][n-1];
}
};