题目:
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 1
and 0
respectively
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.
思路:这道题和LeetCode:
56 Unique Paths非常相似,只是这次首先要先判断是否有障碍。不是每次都有两个选择(向右,向下)。因为有了这个,我们不能直接求和得到结果。递推式和unique path一样,不过我们每次都要先判断是否有障碍,如果有,dp[i][j] = 0,如果没有dp[i][j] = dp[i-1][j] + dp[i][j-1]. 所以,实际上我们还是只需要一个一维数组,因为更新时的信息足够了。
Attention:
1. 注意和unique path的区别,首先是一维数组的初始化,由于我们还需要判断第一行是否存在障碍,所以初始化时为0.
<span style="font-size:14px;">vector<int> dp(col, 0);</span>
2. 由于我们还需要计算第一行的dp值,所以循环范围从0~row, 0~col.注意计算递归式时,dp[ci] = dp[ci] + dp[ci-1],要先判断ci>0.
<span style="font-size:14px;">for(int ri = 0; ri < row; ri++) { for(int ci = 0; ci < col; ci++) {</span>
3. 我们需要初始化dp[0], 如果obstacleGrid[0][0] = 1, 则会重置dp[0] 为0, 否则dp[0]= 1,将用于更新下一个动态规划表的值。
<span style="font-size:14px;">if(obstacleGrid[ri][ci] == 1) { dp[ci] = 0; } else { if(ci > 0) dp[ci] = dp[ci] + dp[ci-1]; }</span>
复杂度:时间复杂度,一次遍历O(n), 空间复杂度,一维数组,O(N)
AC Code:
<span style="font-size:14px;">class Solution { public: int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) { int row = obstacleGrid.size(); int col = obstacleGrid[0].size(); if(row == 0 || col == 0) return 0; vector<int> dp(col, 0); dp[0] = 1; for(int ri = 0; ri < row; ri++) { for(int ci = 0; ci < col; ci++) { if(obstacleGrid[ri][ci] == 1) { dp[ci] = 0; } else { if(ci > 0) dp[ci] = dp[ci] + dp[ci-1]; } } } return dp.back(); } };</span>