和64题思路一样,只不过这里多了一个障碍,需要另外处理下。
dp
时间复杂度O(nm) 空间复杂度O(nm)
var uniquePathsWithObstacles = function (obstacleGrid) {
let row = obstacleGrid.length;
let col = obstacleGrid[0].length;
let dp = new Array(row).fill(0).map(() => []);
dp[0][0] = obstacleGrid[0][0] === 0 ? 1 : 0;
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
if (obstacleGrid[i][j] === 0) {
// 处理上边界
if (i === 0 && j > 0) {
dp[i][j] = dp[i][j - 1];
}
// 处理左边界
if (j === 0 && i > 0) {
dp[i][j] = dp[i - 1][j];
}
// 处理剩余部分
if (i > 0 && j > 0) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
} else {
// 遇到了障碍
dp[i][j] = 0;
}
}
}
return dp[row - 1][col - 1];
};
优化空间 时间复杂度O(nm) 空间复杂度O(1)
var uniquePathsWithObstacles = function (obstacleGrid) {
let row = obstacleGrid.length;
let col = obstacleGrid[0].length;
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
if (obstacleGrid[i][j] === 1) {
obstacleGrid[i][j] = 0;
} else if (i === 0 && j === 0) {
obstacleGrid[i][j] = 1;
} else {
let left = j > 0 ? obstacleGrid[i][j - 1] : 0;
let up = i > 0 ? obstacleGrid[i - 1][j] : 0;
obstacleGrid[i][j] = left + up;
}
}
}
return obstacleGrid[row - 1][col - 1];
};