63. Unique Paths II
Problem
Tags: Array, Dynamic Programming, Matrix
You are given an m x n integer array grid. There is a robot initially located at the top-left corner (i.e., grid[0][0]). The robot tries to move to the bottom-right corner (i.e., grid[m-1][n-1]). The robot can only move either down or right at any point in time.
An obstacle and space are marked as 1 or 0 respectively in grid. A path that the robot takes cannot include any square that is an obstacle.
Return the number of possible unique paths that the robot can take to reach the bottom-right corner.
The testcases are generated so that the answer will be less than or equal to 2 * 10^9.
Example 1:

Input: obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
Output: 2
Explanation: There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right
Example 2:

Input: obstacleGrid = [[0,1],[0,0]]
Output: 1
Constraints:
m == obstacleGrid.lengthn == obstacleGrid[i].length1 <= m, n <= 100obstacleGrid[i][j]is0or1.
Code
C
// 63. Unique Paths II (3/1/54352)
// Runtime: 8 ms (19.08%) Memory: 6.12 MB (37.40%)
int uniquePathsWithObstacles (int** obstacles, int rows, int* cols) {
uint32_t* counts = calloc(rows * *cols, sizeof(uint32_t));
counts[0] = !obstacles[0][0];
for (size_t y = 0; y < rows; y++) {
for (size_t x = 0; x < *cols; x++) {
if (!(x == 0 && y == 0) && !obstacles[y][x]) {
counts[y * *cols + x] = (x > 0 ? counts[y * *cols + x - 1] : 0) + (y > 0 ? counts[(y - 1) * *cols + x] : 0);
}
}
}
return counts[rows * *cols - 1];
}
TS
// 63. Unique Paths II (2/22/54352)
// Runtime: 115 ms (25.62%) Memory: 45.34 MB (12.40%)
function uniquePathsWithObstacles(obstacles: number[][]): number {
const rows = obstacles.length;
const cols = obstacles[0].length;
const counts: number[][] = Array
.from(
{ length: rows },
() => Array.from({ length: cols }, () => 0)
);
counts[0][0] = obstacles[0][0] === 0 ? 1 : 0;
for (let y = 0; y < rows; y++) {
for (let x = 0; x < cols; x++) {
if (counts[y][x] === 0 && obstacles[y][x] === 0) {
counts[y][x] = (y > 0 ? counts[y - 1][x] : 0) + (x > 0 ? counts[y][x - 1] : 0);
}
}
}
return counts[rows - 1][cols - 1];
};