代码随想录-2023/08/05

84 阅读1分钟

动态规划

62.不同路径

解题思路:

动态规划: 达到每个位置的不同路径由其上方来的+左方来的

代码:

class Solution {
    public int uniquePaths(int m, int n) {
        // 动态规划 --- (0,0) -> (m, n) 的不同路径
        int[][] dp = new int[m][n];
        // 初始化 第一行
        for(int col = 0; col < n; col++) {
            dp[0][col] = 1;
        }
        // 初始化第一列
        for(int row = 0; row < m; row++) {
            dp[row][0] = 1;
        }

        for(int i=1; i<m; i++) {
            for(int j=1; j<n; j++) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }

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

63.不同路径II

解题思路:

动态规划:

  1. 和不同路径I相比, 遇到有障碍物的地方, 则dp数组标记不可达 路径方案自然为0
  2. 注意初始化时候, 遇到障碍物了, 则障碍物后面的地方不可达

代码:

class Solution {
    // 路径上有障碍物的不同路径
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length, n = obstacleGrid[0].length;
        // 起点或者终点就是障碍物, 则不可达
        if(obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1) return 0;

        // 如果当前位置不可达, 则将到达当前位置的不同路径数量置为0
        int[][] dp = new int[m][n];
        dp[0][0] = 1;

        // 初始化
        boolean flag = true;
        for(int col=1; col < n; col++){
            if(obstacleGrid[0][col] == 0 && flag){
                dp[0][col] = 1;
            }else{
                dp[0][col] = 0;
                flag = false;
            }
            
        } 
        flag = true;
        for(int row=1; row < m; row++){
            if(obstacleGrid[row][0] == 0 && flag){
                dp[row][0] = 1;
            }else{
                dp[row][0] = 0;
                flag = false;
            }  
        }

        for(int i=1; i<m; i++){
            for(int j=1; j<n; j++) {
                dp[i][j] = obstacleGrid[i][j]==1?0:dp[i-1][j] + dp[i][j-1];
            }
        }

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