63. 不同路径 II

130 阅读1分钟

题目描述

image.png

DP

A9843572004F34EEB67695E7C12D1319.png

  • 当障碍,DPij填0
  • 无障碍,dp分四个区域进行填充
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid[0].length, n = obstacleGrid.length;
        int[][] dp = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (obstacleGrid[i][j] == 1) {//有障碍
                    dp[i][j] = 0;
                } else {//无障碍
                    if (i == 0 && j == 0) {//左上角 【A】
                        dp[i][j] = 1;
                    } else if (i == 0 && j - 1 >= 0) {//最上面那一行 【B】
                        dp[i][j] = dp[i][j - 1]; //不能直接填1,可能有障碍,取决于左边一格
                    } else if (j == 0 && i - 1 >= 0) {//最左边一列 【C】
                        dp[i][j] = dp[i - 1][j]; ////不能直接填1,可能有障碍,取决于上边一格
                    } else {//其他 【D】
                        dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                    }
                }
            }
        }
        return dp[n - 1][m - 1];
    }
}