63. Unique Paths II Medium

来源:互联网 发布:android性能优化典范 编辑:程序博客网 时间:2024/06/06 08:37

接上一题Unique Paths,这里增加了有障碍的情况。其实也很好理解。对于数组中不是边界的情况,原本d[i][j]等于来自上方和左边两个的和,如果上面是障碍,则从上面来的路径数为0,左边类似。不同的是,边界中原本路径数为1,如果边界中有障碍,障碍后面的都为0。需要注意的是,存在起点有障碍和终点有障碍的情况。

class Solution {public:    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {        int m = obstacleGrid.size(), n = obstacleGrid[0].size();        int d[m][n];        if(obstacleGrid[m - 1][n - 1] == 1)return 0; //终点可能是障碍        for (int i = 0; i < m; ++i)        {        for (int j = 0; j < n; j++){        if(i == 0 && j == 0)d[i][j] = obstacleGrid[0][0] == 1? 0: 1;//起点可能是障碍        //边界情况,不在乎障碍处的值,因为不会用到        else if(i == 0 && j != 0){        d[i][j] = obstacleGrid[i][j - 1] == 1? 0: d[i][j - 1];  //这里不直接赋1,可以免去检查前面是否有障碍        }        else if (j == 0 && i != 0)        {        d[i][j] = obstacleGrid[i - 1][j] == 1? 0: d[i - 1][j];        }        else {        int up = obstacleGrid[i - 1][j] == 1? 0: d[i - 1][j];        int left = obstacleGrid[i][j - 1] == 1? 0: d[i][j - 1];        d[i][j] = up + left;        }        }        }        return d[m - 1][n - 1];    }};