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] is 0 or 1.

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];
};