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.
方法一:与I一样,动态规划。
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = obstacleGrid.size();
int m = obstacleGrid[0].size();
if(obstacleGrid[0][0] == 1 || obstacleGrid[n-1][m-1] == 1) return 0;
obstacleGrid[0][0] = 1;
for(int i = 1;i<n;i++)
{
obstacleGrid[i][0] = (obstacleGrid[i][0] == 0)?obstacleGrid[i-1][0]:0;
}
for(int i = 1;i<m;i++)
{
obstacleGrid[0][i] = (obstacleGrid[0][i] == 0)?obstacleGrid[0][i-1]:0;
}
for(int i = 1;i<n;i++)
{
for(int j = 1;j < m;j++)
{
obstacleGrid[i][j] = (obstacleGrid[i][j] == 0)?(obstacleGrid[i-1][j] + obstacleGrid[i][j-1]):0;
}
}
return obstacleGrid[n-1][m-1];
}
};
28 milli secs
时间复杂度O(n^2),空间O(n^2),但在这道题中没有extra space
另一种写法:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = obstacleGrid.size();
int m = obstacleGrid[0].size();
if(obstacleGrid[0][0] == 1 || obstacleGrid[n-1][m-1] == 1) return 0;
vector<int> dp(m+1,0);
int j = m-1;
while(j>=0 && obstacleGrid[n-1][j] == 0)
dp[j--] = 1;
j = n-1;
while(--j >= 0)
{
for(int k = m-1;k>=0;k--)
dp[k] = (obstacleGrid[j][k] == 0)?dp[k] + dp[k+1]:0;
}
return dp[0];
}
};
20 milli secs