【Leetcode】63. 不同路径 II

32 阅读1分钟

leetcode-63.png

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