题目:
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 as1and0respectively in the grid.
题意:
在unique-paths基础上加了障碍物,有障碍物那条路就不能走了,再求起点到终点有多少条路径。
解题思路:
和原先unique-paths 思路差不多
当起点就有障碍物的时候,就直接返回0了
确定边界,当遇到障碍物的时候,也就是当前值等于1,那么就停止赋值了,因为这条路已经走不通了。
还有就是 推导递推公式的时候,如果遇到障碍物,那么就需要将当前的dp[i][j] 置于0 ,也就是这条路白走了。
递推公式还是不变的。
下面给出代码,空间和时间的复杂度还是O(m*n):
public static int uniquePathsWithObstacles(int[][] obstacleGrid) {
if(obstacleGrid == null || obstacleGrid.length == 0 || obstacleGrid[0].length == 0 ||obstacleGrid[0][0] == 1) {
return 0;
}
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
for(int i =0;i < m;i++) {
if(obstacleGrid[i][0] == 1) {
break;
}
else {
dp[i][0] = 1;
}
}
for(int i =0;i < n;i++) {
if(obstacleGrid[0][i] == 1) {
break;
}
else {
dp[0][i] = 1;
}
}
for(int i = 1;i < m;i++) {
for(int j =1;j < n;j++) {
if(obstacleGrid[i][j] == 1) {
dp[i][j] = 0;
}
else {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}