您的位置:首页 > 产品设计 > UI/UE

Unique Paths II

2013-08-01 16:22 316 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: