题目:http://oj.leetcode.com/problems/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 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.
题目翻译:
"Unique Paths"续:
现在考虑如果在网格中添加一些障碍,会有多少种不同的路径?
网格中分别用1和0标记障碍物和空的网格。
例如,
下图所示的3 x 3方格的中间有一个障碍。
不同的路径总数为2。
注意:m和n最大为100。
分析:
有障碍的地方路径数为0。
C++实现:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
if(obstacleGrid[0][0] == 1)
{
return 0;
}
else if(m == 1 && n == 1)
{
return 1;
}
int paths[m][n];
for(int i = 0; i < m; ++i)
{
if(obstacleGrid[i][0] == 1)
{
while(i < m)
{
paths[i][0] = 0;
++i;
}
break;
}
else
{
paths[i][0] = 1;
}
}
for(int j = 1; j < n; ++j)
{
if(obstacleGrid[0][j] == 1)
{
while(j < n)
{
paths[0][j] = 0;
++j;
}
break;
}
else
{
paths[0][j] = 1;
}
}
for(int i = 1; i < m; ++i)
for(int j = 1; j < n; ++j)
{
if(obstacleGrid[i][j] == 1)
{
paths[i][j] = 0;
}
else
{
paths[i][j] = paths[i][j - 1] + paths[i - 1][j];
}
}
return paths[m - 1][n - 1];
}
};
Java实现:
public class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
// if (m == 0) {
// return 0;
// }
int n = obstacleGrid[0].length;
if (obstacleGrid[0][0] == 1) {
return 0;
} else if (m == 1 && n == 1) {
return 1;
}
int[][] paths = new int[m][n];
for (int i = 0; i < m; ++i) {
if (obstacleGrid[i][0] == 1) {
while (i < m) {
paths[i][0] = 0;
++i;
}
break;
} else {
paths[i][0] = 1;
}
}
for (int j = 1; j < n; ++j) {
if (obstacleGrid[0][j] == 1) {
while (j < n) {
paths[0][j] = 0;
++j;
}
break;
} else {
paths[0][j] = 1;
}
}
for (int i = 1; i < m; ++i)
for (int j = 1; j < n; ++j) {
if (obstacleGrid[i][j] == 1) {
paths[i][j] = 0;
} else {
paths[i][j] = paths[i][j - 1] + paths[i - 1][j];
}
}
return paths[m - 1][n - 1];
}
}
Python实现:
class Solution:
# @param obstacleGrid, a list of lists of integers
# @return an integer
def uniquePathsWithObstacles(self, obstacleGrid):
m = len(obstacleGrid)
n = len(obstacleGrid[0])
if obstacleGrid[0][0] == 1:
return 0
elif m == 1 and n == 1:
return 1
paths = [[] for i in range(m)]
for i in range(m):
if obstacleGrid[i][0] == 1:
while(i < m):
paths[i].append(0)
i += 1
break;
else:
paths[i].append(1)
for j in range(1, n):
if obstacleGrid[0][j] == 1:
while(j < n):
paths[0].append(0)
j += 1
break;
else:
paths[0].append(1)
for i in range(1, m):
for j in range(1, n):
if obstacleGrid[i][j] == 1:
paths[i].append(0)
else:
paths[i].append(paths[i][j - 1] + paths[i - 1][j])
return paths[m - 1][n - 1]
感谢阅读,欢迎评论!