LeetCode_115_UniquePathsII


1. question: 不同路径II(中等)

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

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

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

网格中的障碍物和空位置分别用 1 和 0 来表示。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-paths-ii

示例 1:

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

示例 2:

1
2
输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

1
2
3
4
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j] 为 0 或 1

2. answers

这道题和不同路径类似,这不过本题还设置了障碍物,此时如果是障碍物,就设置该路径总和为0即可。别的没什么可说的,代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class Solution_0115 {

public int uniquePathsWithObstacles(int[][] obstacleGrid) {

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

// 初始化到达该位置的路径总和为1.
obstacleGrid[0][0] = 1;

for (int i = 0; i < obstacleGrid.length; i++) {

for (int j = 0; j < obstacleGrid[0].length; j++) {

if(i == 0 && j == 0) continue;

// 当本元素为1,即表示有障碍物,即到达本元素的路径和为0,方便后续其他位置使用。
if(obstacleGrid[i][j] == 1) {

obstacleGrid[i][j] = 0;
continue;
}

if(i - 1 >= 0 && j - 1 >= 0) obstacleGrid[i][j] = obstacleGrid[i][j-1] + obstacleGrid[i-1][j];
if(i - 1 >= 0 && j - 1 < 0) obstacleGrid[i][j] = obstacleGrid[i-1][j];
if(i - 1 < 0 && j - 1 >= 0) obstacleGrid[i][j] = obstacleGrid[i][j - 1];
}
}

return obstacleGrid[obstacleGrid.length - 1][obstacleGrid[0].length - 1];
}

public static void main(String[] args) {
System.out.println();

// int[][] obstacleGrid = {{0,0,0},{0,1,0},{0,0,0}};
int[][] obstacleGrid = {{0,1},{0,0}};

Solution_0115 s = new Solution_0115();

System.out.println(s.uniquePathsWithObstacles(obstacleGrid));
}
}

3. 备注

参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com)代码随想录 (programmercarl.com)


文章作者: 浮云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 浮云 !
  目录