不一样路径II(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Fini...

示例 1:数组

输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有  条不一样的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

思路分析这个问题和上一篇路径题的分析同样,不一样之处在于,加了障碍物。那么咱们能够从新定义一个二维数组,用来返回路径数,具体思路见代码注释。2
public static int uniquePathsWithObstacles(int[][] arr) { int m = arr.length; int n = arr[0].length; //若是起始位置和终点位置为1,直接返回0 if(arr[0][0] == 1 || arr[m-1][n-1] == 1) return 0; //若是m == 1,判断第m-1行是否是有1,有1直接返回0,不然返回1 if(m == 1) { for(int j = 1;j<n;j++) { if(arr[0][j] == 1) return 0; } return 1; } //若是n == 1,判断第n-1列是否是有1,有1直接返回0,不然返回1 if(n == 1) { for(int i = 1;i < m;i++) { if(arr[i][0] == 1) return 0; } return 1; } //定义和输入数组arr同样大小的数组,做为判断 int[][] array = new int[m][n]; for(int j = 1;j<n;j++) { //判断arr[0][j]是否等于1,若是不等于1,那么array[0][j]等于0,若是等于1, //从j列开始到j<n,array[0][j]所有赋值为0 if(arr[0][j] == 0) { array[0][j] = 1; }else { for(int k = j;k<n;k++) { array[0][k] = 0; } break; } } for(int i = 1;i<m;i++) { //判断arr[i][0]是否等于1,若是不等于1,那么array[i][0]等于0,若是等于1, //从i行开始到i<m,array[i][0]所有赋值为0 if(arr[i][0] == 0) { array[i][0] = 1; }else { for(int k = i;k<m;k++) { array[k][0] = 0; } break; } } for(int i = 1;i<m;i++) { for(int j = 1;j<n;j++) { //若是arr[i][j] == 1,array = 0,不然array[i][j] = array[i-1][j] + array[i][j - 1] if(arr[i][j] == 0) { array[i][j] = array[i-1][j] + array[i][j - 1]; } } } //返回数组array最后一个数 return array[m-1][n-1]; }
相关文章
相关标签/搜索