Unique Paths II
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
1and0respectively in the grid.For example,
There is one obstacle in the middle of a 3x3 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 的基础上增加了障碍物。问从起点到终点有多少种走法。
解题思路:
基于上一篇博客,即Unique Paths这道题里的最后一个方法,就是空间复杂度O(min(m,n))的那个解法,接下来的算法的原理就是基于那个的。
因为起点到右边的点路径是唯一的,到下边点路径是唯一的。
所以可以得到一条重要的规律:
起点到终点的路径数等于右边那个点到终点路径数与下边那个点到终点路径数的和。
大概过程是酱紫的:
- 用一个长度为n+1的vector对每一列dp 。
- 初始化一个长度为n+1,所有值都为0的vector<int> dp
- 最开始的时候初始化最后一行,如果不是障碍物,就将dp的对应位置变成1
- 然后分别对倒数第二行,倒数第三行……第一行更新dp[i],dp[i] = (mat[m][i] == 1) ? 0 : dp[i] + dp[i+1];
- 最后dp中存储的是第一行的每一个非障碍物点到终点的路径数。
- dp[0]就是我们的起点啦!~
代码如下:
class Solution { public: int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) { int m = obstacleGrid.size(); int n = obstacleGrid[0].size(); vector<int> dp(n+1,0); m--; int i = n-1; while(i >= 0 && obstacleGrid[m][i] != 1){ dp[i] = 1; --i; } while(m-- > 0){ //这种循环判断可以将只有一行的情况统一考虑进去 for(i = n-1; i >= 0; i--){ dp[i] = (obstacleGrid[m][i] == 1)? 0 : dp[i+1] + dp[i]; } } return dp[0]; } };