解题思路和剑指offer47、leetcode62、leetcode64、leetcode120类似。
这里为动态规划的思想:
若要到达位置[i, j],那么总的路径条数就等于到达[i, j]上面的模块[i-1, j]和左边的模块[i, j-1]路径的总和,从而将目标转移到[i-1,j]和[i,j-1],最终转移到模块[0,0]
注意对第一行和第一列的处理和障碍物的阻碍
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
if (obstacleGrid.empty() || obstacleGrid[0].empty())
return 0;
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<unsigned int>> dp(m, vector<unsigned int>(n, 0)); //这里使用了额外空间,如果面试官说可以
//修改原数组也可以使用原数组进行记录
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
if (obstacleGrid[i][j] == 1) { //经过障碍物的路径是不行的
dp[i][j] = 0;
}
else
{
if (i == 0 && j == 0) {
dp[i][j] = 1;
}
else if (i == 0) {
dp[i][j] = dp[i][j-1]; //第一行只有左边一条可能到达的路径
}
else if (j == 0) {
dp[i][j] = dp[i-1][j]; //第一列同理
}
else {
//到达左边模块和上边模块的路径之和
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
}
return dp[m-1][n-1];
}
};