LeetCode Unique Paths2

题意

第62题(Unique Paths)的升级版. 现在需要考虑如果表格中存在一些障碍,那么所要求的路径数还有多少条? 在表格表示中,1表示此位置有障碍,0表示没有. 例如在一个3 x 3的表格中存在一个障碍物,

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

求得最终的路径数为2. 注意:m 和 n 均不超过100.

题解

算法及复杂度(3 ms) 本题解法参考第62题(Unique Paths).本题和62题的唯一区别是存在了障碍物.但是这个对于算法是没有影响的. 在62题算法的基础上,在求解的过程中,每个点判断本点是否是障碍物,如果是则将dpi置0即可. 参考代码中与62题代码只添加了4行. 时间复杂度: O(mn),表格中每个位置进行一次计算即可. 代码参见本文件夹下solution.cpp

算法正确性

正确性证明 UniquePaths 举个例子

// 输入数据
obstacleGrid = [
[0,0,0],
[0,1,0],
[0,0,0]
]
//初始化m = 3, n = 3, p[0][0:n] = 0, dp[0:m][0] = 0, dp[1][1] = 1
//求解
dp[1][2] = dp[0][2] + dp[1][1] = 1
dp[1][3] = dp[0][3] + dp[1][2] = 1
dp[2][1] = dp[1][1] + dp[2][0] = 1
dp[2][2] = dp[1][2] + dp[2][1] = 2,由于obstacleGrid[1][1]位置为1,经过换算,也就是此位置为1,则dp[2][2] = 0
dp[2][3] = dp[1][3] + dp[2][2] = 1
dp[3][1] = dp[2][1] + dp[3][0] = 1
dp[3][2] = dp[2][2] + dp[3][1] = 1
dp[3][3] = dp[2][3] + dp[3][2] = 2
//return 2

CPP代码

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size(), n = obstacleGrid[0].size();
        vector<vector<int>>dp(m + 1, vector<int>(n + 1));
        for(int i = 0; i <= m; i ++) dp[i][0] = 0;
        for(int j = 0; j <= n; j ++) dp[0][j] = 0;
        
        for(int i = 1; i <= m; i ++) {
            for(int j = 1; j <= n; j ++) {
                if(i == 1 && j == 1) {
                    dp[i][j] = 1;
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
                if(obstacleGrid[i - 1][j - 1] == 1) {
                    dp[i][j] = 0;
                }
            }
        }
        return dp[m][n];
    }
};

你可能感兴趣的:(leetcode题解)