不同路径 II

72 阅读3分钟

这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

leetcode 不同路径 II

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

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

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

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

 

示例 1:

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

示例 2:

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

解题:obstacleGrid二维数组中每次只能往下或者往右移动一个位置,要加计算从二维数组的左上角到右下角有多少不同的路径,并且二维数组中随机分布有一个障碍物,表示这条路不通,那么可以考虑使用动态规划,计算到达每一个元素的不同路径总数,最后获取右下角元素值即可。因为每次移动的话只能向下或者向右移动一步,所以对于第一行的元素上方没有元素了,那么如果要到达第一行元素的位置就只能从其左边元素往右移动到达,所以到达第一行元素的路径就只有往右移动一条路径。对于第一列的元素左边没有元素了,那么要达到第一列元素的位置就只能从其上方元素往下移动到达,所以到达第一列元素的路径就只有往下移动一条路径。那对于那些上方或者左方都有元素的位置,如果要到达这样一个位置是可以从其上方往下移动或者从其左方往下移动,那么这个到达这个位置的路径数就是到达其上方元素路径数加上达到其左方元素路径数之和。同时如果元素位置是障碍物的话,说明到达该位置的路径为0,表示无法到达这里。只要如此往复计算到达最后一个元素(右下角)时就是答案的路径数了。具体的第一一个二维数组dp和原数组obstacleGrid大小一致的,然后dp[i][j]元素值就表示从obstacleGrid[0][0]位置移动到obstacleGrid[i][j]位置的总不同路径,初始的遍历obstacleGrid第一行元素,如果当前元素[i][0]的值不等于1,那么不同路径数就是dp[i][0]=1,否则说明是障碍物就为0,然后再遍历第一列元素,如果当前元素[0][j]的值不等于1,那么不同路径数量就是dp[0][j]=1,否则就为0,然后遍历其余元素,那么i>0、j>0对于到达当前元素[i][j]的值如果不是1的话不同路径总数就是dp[i−1][j]+dp[i][j−1],否则是障碍物为0,最后走到右下角位置的元素值就是总不同路径数了。

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];
        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
            dp[i][0] = 1;
        }
        for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
            dp[0][j] = 1;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (obstacleGrid[i][j] == 0) {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        return dp[m - 1][n - 1];
    }
}