博客
关于我
leetcode 63. Unique Paths II
阅读量:134 次
发布时间:2019-02-26

本文共 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));    }}

    代码解释

    • 初始化检查:首先检查起点和终点是否有障碍物,如果有,直接返回 0。
    • dp数组初始化:起点为 1,其他位置初始化为 0。
    • 填充dp数组:遍历网格,对于每个点,根据其上方和左方的值计算当前点的路径数量。如果遇到障碍物,路径数量设为 0。
    • 返回结果:终点的路径数量即为结果。

    这种方法的时间复杂度为 O(mn),空间复杂度为 O(mn),适用于较大的网格尺寸。

    转载地址:http://ardy.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现newton_raphson牛顿拉夫森算法(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现not gate非门算法(附完整源码)
    查看>>
    Objective-C实现number of digits解字符数算法(附完整源码)
    查看>>
    Objective-C实现NumberOfIslands岛屿的个数算法(附完整源码)
    查看>>
    Objective-C实现n皇后问题算法(附完整源码)
    查看>>
    Objective-C实现OCR文字识别(附完整源码)
    查看>>
    Objective-C实现odd even sort奇偶排序算法(附完整源码)
    查看>>
    Objective-C实现page rank算法(附完整源码)
    查看>>
    Objective-C实现PageRank算法(附完整源码)
    查看>>
    Objective-C实现pascalTriangle帕斯卡三角形算法(附完整源码)
    查看>>
    Objective-C实现perfect cube完全立方数算法(附完整源码)
    查看>>
    Objective-C实现PNG图片格式转换BMP图片格式(附完整源码)
    查看>>
    Objective-C实现pollard rho大数分解算法(附完整源码)
    查看>>
    Objective-C实现quick select快速选择算法(附完整源码)
    查看>>
    Objective-C实现recursive bubble sor递归冒泡排序算法(附完整源码)
    查看>>
    Objective-C实现recursive insertion sort递归插入排序算法(附完整源码)
    查看>>
    Objective-C实现RedBlackTree红黑树算法(附完整源码)
    查看>>
    Objective-C实现redis分布式锁(附完整源码)
    查看>>