LeetCode 63. Unique Paths II 不同的路径 II

题目

https://leetcode.com/problems/unique-paths-ii/description/

Follow up for “Unique Paths”:

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

For example,

There is one obstacle in the middle of a 3×3 grid as illustrated below.

[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]

The total number of unique paths is 2.

Note: m and n will be at most 100.

讲解

这道题是Unique Paths 不同的路径的follow up问题。

机器人每次可以向下走或者向右走,求到达最右下角的格子的所有不同走法的总数。现在在路径中加了一些障碍物,还是用动态规划来解。

我们可以用一个二维的动态数组表示到每一个格子的不同走法总数。

如果没有遇到障碍,最左边一列或者最上面一排的格子的走法总数是1。遇到障碍,则剩余的格子走法总数都为0。

而对于其他的不在第一排或第一列的格子,如果没有遇到障碍,走法总数则是左边的相邻格子走法总数加上相邻的上面那个格子的走法总数。遇到障碍,该格子走法总数则为0。

视频教学

Java参考代码

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        if (obstacleGrid == null || obstacleGrid.length == 0 || obstacleGrid[0].length == 0) {
            return 0;
        }
        
        int height = obstacleGrid.length;
        int width = obstacleGrid[0].length;
        
        int[][] paths = new int[height][width];
        
        // first column
        for (int i = 0; i < height; i++) {
            if (obstacleGrid[i][0] != 1) {
                paths[i][0] = 1;
            } else {
                break;
            }
        }
        
        // first row
        for (int j = 0; j < width; j++) {
            if (obstacleGrid[0][j] != 1) {
                paths[0][j] = 1;
            } else {
                break;
            }
        }
        
        // for spaces not at first row or first column
        for (int i = 1; i < height; i++) {
            for (int j = 1; j < width; j++) {
                if (obstacleGrid[i][j] != 1) {
                    paths[i][j] = paths[i - 1][j] + paths[i][j - 1];
                }                
            }
        }
        
        return paths[height - 1][width - 1];
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注