本文共 1729 字,大约阅读时间需要 5 分钟。
要解决包含障碍物的网格路径计数问题,可以使用动态规划方法。这种方法通过构建一个二维数组记录到每个点的路径数量,从而高效地处理障碍物。
问题分析:在没有障碍物的情况下,路径数量可以通过组合数学计算得出。但是,障碍物的存在使得这种方法失效,需要寻找其他方法。
动态规划方法:使用一个二维数组 dp,其中 dp[i][j] 表示到达点 (i, j) 的路径数量。状态转移方程为:每个位置只能由其上方和左方的位置移动而来,所以 dp[i][j] = dp[i-1][j] + dp[i][j-1]。
边界条件:
(0, 0) 初始化为 1(如果没有障碍物)。(m-1, n-1) 或起点有障碍物,直接返回 0。处理障碍物:在遍历网格时,如果当前点是障碍物,路径数量设为 0。
public class UniquePaths { public static int uniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0].length; // 起点和终点是否有障碍物 if (obstacleGrid[0][0] != 0 || obstacleGrid[m - 1][n - 1] != 0) { return 0; } // 初始化dp数组 int[][] dp = new int[m][n]; dp[0][0] = 1; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i == 0 && j == 0) { continue; } if (i == 0) { dp[i][j] = dp[i][j - 1]; } else if (j == 0) { dp[i][j] = dp[i - 1][j]; } else { dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } // 检查是否为障碍物 if (obstacleGrid[i][j] == 1) { dp[i][j] = 0; } } } return dp[m - 1][n - 1]; } public static void main(String[] args) { int[][] obstacleGrid = { {0, 0, 0}, {0, 1, 0}, {0, 0, 0} }; System.out.println(uniquePathsWithObstacles(obstacleGrid)); }} 这种方法的时间复杂度为 O(mn),空间复杂度为 O(mn),适用于较大的网格尺寸。
转载地址:http://ardy.baihongyu.com/