题目

思路与算法
本题与上一道不带障碍的题基本没有什么太大区别,状态方程的差距就在于这个障碍处的处理:(复制了代码注释)
- // 第一行:无障碍,则该点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];
}
}
本文深入解析了LeetCode上不同路径Ⅱ题目的算法思路,通过动态规划的方法解决了带障碍物的网格路径寻找问题。文章详细介绍了状态方程的设定,包括如何处理起点和障碍物的特殊情况,并提供了完整的Java代码实现。
&spm=1001.2101.3001.5002&articleId=104386460&d=1&t=3&u=4ffb727aa50e4b93b6b6a4a6378fdf9f)
2799

被折叠的 条评论
为什么被折叠?



