题目
题目地址:https://leetcode.com/problems/unique-paths-ii/
题意解析
题目的意思还是求路径,不过路径中会存在阻碍,阻碍的位置将不能通过。这个是和前一个问题中不一样的地方,也因为这样,难度升高了一点点。
求解
定义最优解:最优解为从原点出发的所有路径。
定义最优解的值:这样的路径有多少个。
递归式表示最优解的值:
f[i,j] 表示从[0,0]出发到[i,j]的路径的个数。所以有递归式
f[i,j]=f[i-1,j]+f[i,j-1];//分别对应向右和向下的情况
初始化条件
f[0,0]=1 obstacleGrid[0][0]==1 ? 0 : 1;
f[0][i]的判断根据位置的obstacleGrid是否为1,在遇到阻碍 1 之后的f[0][i]=0;所以需要设置flag
f[j,0]=1判断根据位置的obstacleGrid是否为1,在遇到阻碍 1 之后的f[j][0]=0;所以需要设置flag
Code
Ac 代码
/**
* Created by loveqh on 2016/8/11.
*/
public class UniquePathsII {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
//行 列
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] f = new int[m][n];
boolean obstacle = false;
f[0][0] = obstacleGrid[0][0] == 1 ? 0 : 1;
for (int i = 0; i < m; i++) {
if (!obstacle) {
if (obstacleGrid[i][0] == 0) {
f[i][0] = 1;
} else {
obstacle = true;
f[i][0] = 0;
}
} else {
f[i][0] = 0;
}
}
obstacle = false;
for (int j = 0; j < n; j++) {
if (!obstacle) {
if (obstacleGrid[0][j] == 0) {
f[0][j] = 1;
} else {
obstacle = true;
f[0][j] = 0;
}
} else {
f[0][j] = 0;
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
f[i][j] = obstacleGrid[i][j] == 0 ? f[i - 1][j] + f[i][j - 1] : 0;
}
}
return f[m - 1][n - 1];
}
}