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.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j]
is0
or1
.
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];
};