不同路径 II

题目描述:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

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

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/unique-paths-ii/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:递归法

首先,经过分析可知,到达任意一个单元格子的最后一步,可以从这个格子的左边过来,也可以从这个格子的上边过来,所以到达任意一个格子的步数是到它左边的步数加上到它上面格子的步数之和,所以可以用递归的方法求解,具体过程如下:

  • 如果m等于1或者n等于1,直接返回1;
  • 如果上面的条件不满足,则递归调用该方法求解uniquePaths(m - 1, n) + uniquePaths(m, n - 1)

说明:LeetCode-062-不同路径的区别在于,当左边或者上面的走法为0(即走不通的时候),则只用继续往一个方向递归。

解法二:迭代法

首先记录第一行的格子的走法columns,从第一个元素开始判断,如果第一个元素的值为1(即有障碍物),则为0,然后给columns的后面的元素赋值,赋值时需要同时判断前面一个元素的值和当前位置是否有障碍物。然后根据columns迭代获取下面每一行相应的走法,迭代过程如下:

  • 首先根据上一行第一个元素的值和当前行第一个元素是否有障碍物获取columns[0]的值;
  • 然后重复上面的过程,给columns的后面的元素赋值,赋值时需要同时判断前面一个元素的值和当前位置是否有障碍物。

最后返回columns最后一个元素的值即为最终的走法。

说明:解决过程类似 LeetCode-062-不同路径,特别注意当第一个元素为1时,则走不通;当只有一个元素时,且为0时,返回1也就是有一种走法,而不是返回0。

public class LeetCode_063 {
/**
* 递归法
*
* @param obstacleGrid
* @return
*/
public static int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length, n = obstacleGrid[0].length;
if (m == 1 && n == 1) {
if (obstacleGrid[m - 1][n - 1] == 1) {
return 0;
} else {
return 1;
}
}
if (obstacleGrid[m - 1][n - 1] == 1) {
return 0;
}
return uniquePathsWithObstacles(obstacleGrid, obstacleGrid.length - 1, obstacleGrid[0].length - 1);
} private static int uniquePathsWithObstacles(int[][] obstacleGrid, int x, int y) {
if (obstacleGrid[x][y] == 1) {
return 0;
}
if (x == 0 && y == 0) {
if (obstacleGrid[x][y] == 1) {
return 0;
} else {
return 1;
}
} if (x > 0) {
if (y > 0) {
if (obstacleGrid[x - 1][y] == 1) {
if (obstacleGrid[x][y - 1] == 1) {
return 0;
} else {
return uniquePathsWithObstacles(obstacleGrid, x, y - 1);
}
} else {
if (obstacleGrid[x][y - 1] == 1) {
return uniquePathsWithObstacles(obstacleGrid, x - 1, y);
} else {
return uniquePathsWithObstacles(obstacleGrid, x - 1, y) + uniquePathsWithObstacles(obstacleGrid, x, y - 1);
}
}
} else {
if (obstacleGrid[x - 1][y] == 1) {
return 0;
} else {
return uniquePathsWithObstacles(obstacleGrid, x - 1, y);
}
}
} else {
if (obstacleGrid[x][y - 1] == 1) {
return 0;
} else {
return uniquePathsWithObstacles(obstacleGrid, x, y - 1);
} }
} /**
* 迭代法
*
* @param obstacleGrid
* @return
*/
public static int uniquePathsWithObstacles2(int[][] obstacleGrid) {
int m = obstacleGrid.length, n = obstacleGrid[0].length;
int[] columns = new int[n];
if (obstacleGrid[0][0] == 1) {
columns[0] = 0;
} else {
columns[0] = 1;
}
// 初始化第一行
for (int i = 1; i < n; i++) {
if (columns[i - 1] == 0) {
columns[i] = 0;
continue;
}
if (obstacleGrid[0][i] == 1) {
columns[i] = 0;
} else {
columns[i] = 1;
}
} // 迭代过程
for (int i = 1; i < m; i++) {
// 第一个值
if (columns[0] == 0) {
for(int x = 1; x < n; x++) {
if(obstacleGrid[i][x] == 1) {
columns[x] = 0;
} else {
columns[x] = columns[x - 1] + columns[x];
}
}
continue;
}
if (obstacleGrid[i][0] == 1) {
columns[0] = 0;
} else {
columns[0] = 1;
}
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 1) {
columns[j] = 0;
} else {
columns[j] = columns[j] + columns[j - 1];
}
}
} return columns[n - 1];
} public static void main(String[] args) {
int[][] obstacleGrid = new int[][]{{0}, {1}};
System.out.println(uniquePathsWithObstacles(obstacleGrid));
System.out.println(uniquePathsWithObstacles2(obstacleGrid));
}
}

【每日寄语】 机会不会等你,错过以后可能不会再有。

LeetCode-063-不同路径 II的更多相关文章

  1. Leetcode 063 不同路径二

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为" ...

  2. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

  3. [LeetCode] 63. 不同路径 II ☆☆☆(动态规划)

    描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 现在 ...

  4. LeetCode 63. 不同路径 II(Unique Paths II)

    题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). ...

  5. Java for LeetCode 063 Unique Paths II

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  6. leetcode 63 不同路径II

    二维数组动态规划,还可以采用一维数组进行动态规划. class Solution { public: int uniquePathsWithObstacles(vector<vector< ...

  7. Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II)

    Leetcode之动态规划(DP)专题-63. 不同路径 II(Unique Paths II) 初级题目:Leetcode之动态规划(DP)专题-62. 不同路径(Unique Paths) 一个机 ...

  8. LeetCode:不同路径&不同路径II

    不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问 ...

  9. 刷题-力扣-63. 不同路径 II

    63. 不同路径 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-paths-ii/ 著作权归领扣网络所有.商业转 ...

随机推荐

  1. Java当中“+=”和“=+”的区别

    "+="会自动类型强制转换! 隐含了一个强制类型转换! 一 string a1 = "9"; int a2 = 10; a1+=a2; a1=a1+a2; 不会 ...

  2. Supervisor多进程管理 异常自动重启 可视化管理

    一.序言 Supervisor是多进程管理工具,在Docker中相关联的进程能够通过supervisor来管理. 微服务项目开发阶段,可用于微服务子项目的启动管理. 支持web可视化管理,能够极大方面 ...

  3. 社交网络分析的 R 基础:(四)循环与并行

    前三章中列出的大多数示例代码都很短,并没有涉及到复杂的操作.从本章开始将会把前面介绍的数据结构组合起来,构成真正的程序.大部分程序是由条件语句和循环语句控制,R 语言中的条件语句(if-else)和 ...

  4. JVM学习四:深入分析ClassLoader

    一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程 ...

  5. mysql导出到文件错误(err 1290)

    感谢大佬:https://blog.csdn.net/u014711094/article/details/78501771 select * into outfile 'g:/temp1.txt' ...

  6. iOS中通过链接地址打开指定APP并传参 by徐文棋

    基于项目需要,有时候需要通过一个链接,或者二维码扫描来直接打开我们所开发的客户端. 当然了.客户端也不仅仅是需要被打开,而且还要跳到相应的页面去,因此这里需要传参. 客户端想用链接打开,必须要在inf ...

  7. xss标签和属性爆破

    当网站过滤了大部分的HTML标签和属性,我们就尝试爆破一下,看哪些标签和属性没有没过滤. 爆破的步骤: 1. 首先在测试点输入我们正常的exp,并抓包发送到Intruder模块. 2. 将exp改为 ...

  8. 1python基础语法_11模块

    http://www.runoob.com/python3/python3-module.html 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中 ...

  9. Solution -「洛谷 P5827」边双连通图计数

    \(\mathcal{Description}\)   link.   求包含 \(n\) 个点的边双连通图的个数.   \(n\le10^5\). \(\mathcal{Solution}\)    ...

  10. mysql,数据类型与表操作

    一.mysql基本认知 创建用户 create host aa identified with mysql_native_password by ''; 修改用户权限 alter user root@ ...