题目
思路与算法
本题与上一道不带障碍的题基本没有什么太大区别,状态方程的差距就在于这个障碍处的处理:(复制了代码注释)
- // 第一行:无障碍,则该点dp等于其左边一点的dp(通行路径数),有障碍则将该点dp设为0即可
- // 第一列:无障碍,则该点dp等于其上面一点的dp(通行路径数),有障碍则将该点dp设为0即可
- // 其余非第一行与非第一列: 该点dp等于上面一点与左边一点dp之和,有障碍,则该点dp设为0即可。
- 顺带说一句我为什么需要考虑起点出现障碍的情况,真的扯淡,不写这个起点障碍的特殊处理,这题绝对过不了。。。mdzz
代码实现
package com.immunize.leetcode.uniquePathsWithObstacles;
public class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
// 初始化使用到的变量
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] dp = new int[m][n];
// 起点有障碍,则不存在通行路径,返回0即可。
if (obstacleGrid[0][0] == 1) {
dp[0][0] = 0;
return 0;
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 到达此处,则起点没有障碍,通行路径数为1
if (i == 0 && j == 0) {
dp[0][0] = 1;
}
// 第一行:无障碍,则该点dp等于其左边一点的dp(通行路径数),有障碍则将该点dp设为0即可
if (i == 0 && j != 0) {
dp[i][j] = (obstacleGrid[i][j] == 1) ? 0 : dp[i][j - 1];
}
// 第一列:无障碍,则该点dp等于其上面一点的dp(通行路径数),有障碍则将该点dp设为0即可
if (i != 0 && j == 0) {
dp[i][j] = (obstacleGrid[i][j] == 1) ? 0 : dp[i - 1][j];
}
// 其余非第一行与非第一列: 该点dp等于上面一点与左边一点dp之和,有障碍,则该点dp设为0即可。
if (i != 0 && j != 0) {
dp[i][j] = (obstacleGrid[i][j] == 1) ? 0 : dp[i][j - 1] + dp[i - 1][j];
}
}
}
return dp[m - 1][n - 1];
}
}