LeetCode 打卡day39 --不同路径I, II

一个人的朝圣 — LeetCode打卡第39天

  • 知识总结
  • Leetcode 62. 不同路径
    • 题目说明
    • 代码说明
  • Leetcode 63. 不同路径 II
    • 题目说明
    • 代码说明


知识总结

不同路径的动态规划问题


Leetcode 62. 不同路径

题目链接

题目说明

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?
LeetCode 打卡day39 --不同路径I, II_第1张图片

代码说明

递推公式为:

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];
        for(int i =0; i < m; i++){
            for(int j =0; j < n; j++){
                if(i == 0 || j == 0){
                    dp[i][j] = 1;
                }else{
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        return dp[m-1][n-1];
    }
}

Leetcode 63. 不同路径 II

题目链接

题目说明

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。
LeetCode 打卡day39 --不同路径I, II_第2张图片

代码说明

正常版;

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length, n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];

        if(obstacleGrid[0][0] == 1){
            return 0;
        }
        dp[0][0] = 1; 
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(obstacleGrid[i][j] == 1){
                    dp[i][j] = 0;
                }else{
                    if(i == 0 & j == 0) continue;
                    int upWay =0;
                    int leftWay = 0;
                    if(i> 0){
                        upWay = dp[i-1][j];
                    }
                    if(j > 0){
                        leftWay = dp[i][j-1];
                    }
                    dp[i][j] = upWay + leftWay;
                }
            }
        }
        return dp[m-1][n-1];
    }
}

空间优化版:

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length, n = obstacleGrid[0].length;
        int[] dp = new int[n];

        if(obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1){
            return 0;
        }
        for(int i = 0; i < n && obstacleGrid[0][i] == 0; i++){
            dp[i] = 1;
        } 

        for(int i = 1; i < m; i++){
            for(int j = 0; j < n; j++){
                if (obstacleGrid[i][j] == 1){
                    dp[j] = 0;
                }else if (j > 0){
                        dp[j] += dp[j-1];
                }
                
            }
        }
        return dp[n-1];
    }
}

你可能感兴趣的:(leetcode,算法,动态规划)