题目:

一个机器人位于一个 m x n 的网格的左上角(起始点在下图中标记为 "Start")。机器人每次只能向下或者向右移动一步。网格中部分位置有障碍物,表示为 1,机器人不能通过。问从起始点到达网格的右下角(在下图中标记为 "Finish")有多少条不同的路径?

1.jpg

引言:

"不同路径 II" 是一个关于路径计数和组合问题的进阶问题。解决这个问题需要对路径计数和组合问题有一定的理解,同时需要找到一种方法来遍历网格并计算路径数。通过解答这个问题,我们可以提升对路径计数和组合问题的考虑,同时也能拓展对数组问题的解决方案。

算法思路:

为了不使用动态规划,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历网格并计算路径数。具体思路如下:

  1. 从起始点开始,使用 DFS 或 BFS 遍历网格。
  2. 在遍历的过程中,遇到障碍物时终止继续探索,因为机器人无法通过。
  3. 当到达终点时,计数一条路径。
  4. 最终得到的路径计数即为从起始点到达终点的不同路径数。

代码实现:

以下是使用 Java 实现的 "不同路径 II" 算法的示例代码,使用 DFS 进行遍历:

public class UniquePathsII {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        return dfs(0, 0, obstacleGrid);
    }

    private int dfs(int row, int col, int[][] obstacleGrid) {
        if (row >= obstacleGrid.length || col >= obstacleGrid[0].length || obstacleGrid[row][col] == 1) {
            return 0;
        }

        if (row == obstacleGrid.length - 1 && col == obstacleGrid[0].length - 1) {
            return 1;
        }

        return dfs(row + 1, col, obstacleGrid) + dfs(row, col + 1, obstacleGrid);
    }
}

算法分析:

  • 时间复杂度:在最坏情况下,需要遍历整个网格,所以时间复杂度为 O(m * n),其中 m 和 n 是网格的维度。
  • 空间复杂度:递归调用会使用额外的栈空间,最大深度为 m + n。

示例和测试:

假设给定网格如下(其中 1 表示障碍物,0 表示可通过位置):

[
 [0,0,0],
 [0,1,0],
 [0,0,0]
]

根据算法,从起始点到达终点的不同路径数为 2。

我们可以使用以下代码进行测试:

public class Main {
    public static void main(String[] args) {
        UniquePathsII solution = new UniquePathsII();
        int[][] obstacleGrid = {
            {0,0,0},
            {0,1,0},
            {0,0,0}
        };
        int paths = solution.uniquePathsWithObstacles(obstacleGrid);

        System.out.println("Number of unique paths: " + paths);
    }
}

总结:

"不同路径 II" 算法题要求计算从起始点到达终点的不同路径数,考虑了障碍物的影响,是一个关于路径计数和组合问题的问题。通过实现这个算法,我们可以提升对路径计数和组合问题的考虑,同时也能拓展对数组问题的解决方案。这个问题强调了如何使用搜索算法来遍历网格并计算路径数。

标签: 编程算法, 编程算法题, 编程算法大全, 编程算法流程, 算法设计与分析, 数据结构与算法, 算法优化, 算法实现, 常见编程算法, 编程算法入门, 编程算法进阶, 编程算法精通