leetcode63不同路径 IIjava题解(动态规划)

1.题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
leetcode63不同路径 IIjava题解(动态规划)_第1张图片

网格中的障碍物和空位置分别用 1 和 0 来表示。
说明:m 和 n 的值均不超过 100。
示例 1:
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右 -> 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右 -> 向右
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/unique-paths-ii
    2.想法
    此题为62题的翻版,在62的基础上加上了有障碍的条件,故此题只需将有障碍的地方设置为0即可,代表此路不通过。然后继续像62那样循环。但要注意边界情况,若边界有障碍则该行或该列均为0以及只有一个障碍的情况,直接返回0。
    3.自己题解
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
      int m=obstacleGrid.length;
      int n=obstacleGrid[0].length;  
       int [][]dp=new int[m][n];     
       dp[0][0]=1;
         for(int i=1;i<n;i++){dp[0][i]=dp[0][i-1];if(obstacleGrid[0][i]==1){dp[0][i]=0;}
         }
       
         for(int i=1;i<m;i++){dp[i][0]=dp[i-1][0];if(obstacleGrid[i][0]==1){dp[i][0]=0;}
      	}     
         for(int j=1;j<m;j++){
             for(int k=1;k<n;k++){
                 dp[j][k]=dp[j-1][k]+dp[j][k-1];
                 if(obstacleGrid[j][k]==1){dp[j][k]=0;}
                 //System.out.print(dp[j][k]+" ");
             }
             //System.out.println();
         }
         if(obstacleGrid[0][0]==1){return 0;}
         return dp[m-1][n-1];
    }
}

4.效率
leetcode63不同路径 IIjava题解(动态规划)_第2张图片

你可能感兴趣的:(力扣)