zoukankan      html  css  js  c++  java
  • 不同路径 II

    一个机器人位于一个 m x n 网格的左上角 (起始点标记为“Start” )。

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。

    现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

    示例 1:

    输入:
    [
      [0,0,0],
      [0,1,0],
      [0,0,0]
    ]
    输出: 2
    解释:
    3x3 网格的正中间有一个障碍物。
    从左上角到右下角一共有 2 条不同的路径:
    1. 向右 -> 向右 -> 向下 -> 向下
    2. 向下 -> 向下 -> 向右 -> 向右

    解决思路:

    相比于上节内容,本题网格中存在障碍物,故需要额外考虑两点。

    1,若最下面一行中某个网格存在障碍物,则该网格的前面网格都无法到达end;

             
             
    0 0 障碍物 1 end

    (网格[2][2]存在障碍物,则网格[2][0]与[2][1]均不可达end)

    2,对于网格a,到达end要么通过b,要么通过c,故a到end的总路径

    paths(a) = 0,如果a处存在障碍物;

    paths(a) = paths(b) + paths(c),如果a处不存在障碍物。

    实现代码:

    先将网格的最下面一行与最右面一列填写完成,在填写其它网格。

        public static int test(int[][] obstacleGrid) {
    
            boolean lastLine = false;
            int M = obstacleGrid.length;
            int N = obstacleGrid[0].length;
    
            for (int j=N-1; j>=0; j--) {
                lastLine = obstacleGrid[M-1][j]==1?true:lastLine;
                obstacleGrid[M-1][j] = lastLine?0:1;
            }
    
            for (int i=M-2; i>=0; i--)
                obstacleGrid[i][N-1] = obstacleGrid[i][N-1]==1?0:obstacleGrid[i][N-1]+obstacleGrid[i+1][N-1];
    
    
            for (int j=N-2; j>=0; j--)
                for (int i=M-2; i>=0; i--)
                    obstacleGrid[i][j] = obstacleGrid[i][j]==1?0:obstacleGrid[i+1][j]+obstacleGrid[i][j+1];
    
            return obstacleGrid[0][0];
        }
  • 相关阅读:
    Leetcode题目practice
    文件操作
    39个奇葩代码注释,拿走不谢
    Spring Boot 之配置导入,强大到不行!
    Git 的这个神技,学会爽歪歪~
    同事天天写垃圾代码,就没办法?
    for (;;) 与 while (true),哪个更快?
    Spring Boot 怎么打一个可执行 Jar 包?
    程序员真的是太太太太太太太太难了!
    面试官:new一个对象有哪两个过程?
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9047701.html
Copyright © 2011-2022 走看看