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.
看到此题,第一个想法便是递归,于是递归程序见下
class Solution {
public:
int cnt=0;
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
path(obstacleGrid,0,0);
cout<<cnt<<endl;
return cnt;
}
void path(vector<vector<int>>& obstacleGrid,int startx,int starty)
{
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
int tmp=0;
if(startx==m-1 && starty==n-1)
{
cnt++;
return ;
}
if( startx+1<=m-1 && obstacleGrid[startx+1][starty]!=1)
{
tmp=startx+1;
path(obstacleGrid,tmp,starty);
}
if( starty+1<=n-1&&obstacleGrid[startx][starty+1]!=1)
{
tmp=starty+1;
path(obstacleGrid,startx,tmp);
}
}
};
但是就如同大多数递归的缺点,时间过长,
递归模型为分治法,最本质的特征就是:把一个问题分解成独立的子问题。所以其时间复杂度是指数级的,所以果断动规,果然问题解决。
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m=obstacleGrid.size();
if(m<=0)
{
return 0;
}
int n=obstacleGrid[0].size();
if(n<=0)
{
return 0;
}
if(obstacleGrid[0][0]==1)
{
return 0;
}
int table[101][101];
table[0][0]=1;
for(int i=1;i<m;i++)
{
if(obstacleGrid[i][0]==1)
table[i][0]=0;
else
table[i][0]=table[i-1][0];
}
for(int i=1;i<n;i++)
{
if(obstacleGrid[0][i]==1)
table[0][i]=0;
else
table[0][i]=table[0][i-1];
}
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]==1){
table[i][j]=0;
}
else
table[i][j]=table[i-1][j]+table[i][j-1];
}
return table[m-1][n-1];
}
};