代码随想录算法训练营 day 39: ● 62.不同路径 ● 63. 不同路径 II

53 阅读1分钟

62. Unique Paths

比较直接的二维矩阵DP 问题。在每个节点的状态转移公式为dp[i][j] = dp[i-1][j] + dp[i][j-1]。需判断边界。

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];

        //dp[i][j] = dp[i-1][j] + dp[i][j-1];

        dp[0][0] = 1;

        for(int i=0; i<m; i++) {
            for(int j=0; j<n; j++) {
                if(i==0 && j==0) {
                    continue;
                }
                int left = 0;
                int up = 0;
                if(i>=1) {
                    up = dp[i-1][j]; 
                }
                if(j>=1) {
                    left = dp[i][j-1];
                }

                dp[i][j] = up + left;
            }
        }

        return dp[m-1][n-1];
    }
}

63. Unique Paths II 加上障碍的矩阵DP问题。 要注意起始节点和终点也可以是障碍物,这样就直接没路径了。

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int row = obstacleGrid.length;
        int col = obstacleGrid[0].length;
        int dp[][] = new int[row][col];

        if(obstacleGrid[0][0] == 1) {
            return 0;
        }

        dp[0][0] = 1;

        for(int i=0; i<row; i++) {
            for(int j=0; j<col; j++) {
                if(i==0 && j==0) {
                    continue;
                }
                int updp = 0;
                int leftdp = 0;

                if(i>0 && obstacleGrid[i-1][j] != 1) {
                    updp = dp[i-1][j];
                }
                if(j>0 && obstacleGrid[i][j-1] != 1) {
                    leftdp = dp[i][j-1];
                }

                dp[i][j] = updp + leftdp;

                if(obstacleGrid[i][j] == 1) {
                    dp[i][j] = 0;
                } 

            }
        }

        return dp[row-1][col-1];
    }
}