笔试题76. LeetCode OJ (63)

来源:互联网 发布:sunny crown 人工智能 编辑:程序博客网 时间:2024/06/06 09:40

    Unique Paths II

    这次还是机器人在最左上角,想要到达最右下角,机器人能走的方向还是向下和向右,但是与上次不同的是:路上有障碍物,有障碍物的地方不能通过,找出所有独一无二的路径。

    上个题的解题思路我自己好像也没什么算法根据,凭借的是自己观察问题找到的,不过这个题我还是按照那样的想法去做的话,确实没想通,我试了一下,发现代码很复杂而且没有把握,所以我换了种思路,我借鉴了一下网友的,主要是为了弄明白这个题属于哪一类问题,它是动态规划类的问题!

    首先,我们可以得出这样一个结论:机器人当前所在的位置(i,j)其实是由(i,j-1)或者(i-1,j)位置得到的,所以我们可以得出:

                         nums(i , j) = nums(i , j-1) + nums(i-1 , j)

    这点推导出来了,解题就简单多了,所以我们就可以很方便的解题了,不过需要注意的一点就是,当 (i , j) 位置为障碍物时,它的路径数目为0。


下面就给出代码吧,想清楚思路后真的是很容易就可以解决问题。

class Solution {public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {if (obstacleGrid.size() == 0 || obstacleGrid[0].size() == 0){return 0;}//采用动态规划解题int xLen = obstacleGrid.size();int yLen = obstacleGrid[0].size();//开辟额外的空间,因为每个位置都是由它上方或者左方过来的,所以(i,j)位置的路径=nums(i,j-1)+nums(i-1,j)//多开辟出来的空间其实是辅助作用vector<vector<int>> V(xLen + 1, vector<int>(yLen + 1, 0));V[0][1] = 1;  // 其实将v[1][0]置为1效果一样,因为他们都是辅助空间for (int i = 1; i <= xLen; ++i){for (int j = 1; j <= yLen; ++j){if (obstacleGrid[i-1][j-1] == 0)V[i][j] = V[i][j - 1] + V[i - 1][j]; //nums(i,j) = nums(i,j-1) + nums(i-1,j)elseV[i][j] = 0; //但是考虑到存在障碍物,障碍物对应位置的路径数目为 0 }}return V[xLen][yLen];}};
程序的结果如下:


0 0