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];
        }
  • 相关阅读:
    大的FIbonacci数列_Java求法
    HDU1134_Game of Connections 卡特兰数
    oracle中查询锁表
    SpringBoot之使用Druid连接池以及SQL监控和spring监控
    用vue封装插件并发布到npm
    vue 预览 Excel 表格
    vue + elementUI 表格 底部 合计总数
    springboot项目中实现访问druid内置监控页面
    解决Elementui eltable合计 showsummary不显示,样式混乱问题
    Druid连接池:慢查询监控
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9047701.html
Copyright © 2011-2022 走看看