不同路径 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. 如何保存并复制python虚拟环境

    关于虚拟环境的一些基础概念学习了本期视频 保存 以我的一个虚拟环境示例: 在要保存的虚拟环境下使用: pip freeze > requirements.txt 复制 pip install - ...

  2. 【C++】输入输出

    缓冲 C++ 的输入输出均通过缓冲区来实现.缓冲区主要是为了解决速度不匹配的问题. cin 阻塞输入.当输入缓存中无字符时则等待用户输入. 输入缓冲 输入缓冲是一种行缓冲.在输入数据只要没有碰到换行符 ...

  3. 2022.02.05 DAY2

    前言 今天陪老姐送对象去安庆了,上午还去了西风禅寺求了个签,第一次拿到中评签,看来今年还需要继续努力哈哈哈.一直到晚上才有时间去做点题目,今天依旧是leetcode. 题目 leetcode 1 两数 ...

  4. ApacheCN 大数据译文集(二) 20211206 更新

    Hadoop3 大数据分析 零.前言 一.Hadoop 简介 二.大数据分析概述 三.MapReduce 大数据处理 四.基于 Python 和 Hadoop 的科学计算和大数据分析 五.基于 R 和 ...

  5. kicad6 封装库的管理

    kicad6 封装库的管理 kicad6 的封装编辑器有很多莫名其妙的地方, 让人在第一次用的时候摸不着头脑. 在下面稍微总结一下封装库的操作 1. 封装库的创建 选择 文件 -> 新建库 有两 ...

  6. AtCoder AGC002 简要题解

    从今天开始,联赛之前大约要完成前 \(20\) 套 \(\rm AGC\),希望不要鸽. A 略 B 感觉这题比 \(\rm C\) 题难. 考虑对于每个时刻维护每个位置是否可能出现红球,那么一个时刻 ...

  7. 前后端数据json交换的问题

    问题1:前端发送给后端数据了,后端也接收到了,后端同时返回数据给前端了,但是前端的ajax请求中的success(data){}中的方法不执行 解决:排查了很多问题,结果都一一排除了,最后发现后端发送 ...

  8. get方式和post方式的区别

     1.请求的URL地址不同:             post:"http://192.168.13.83:8080/itheima74/servlet/LoginServlet" ...

  9. 「2022」打算跳槽涨薪,必问面试题及答案 -- ECMAScript 篇

    起点低怕什么,大不了加倍努力.人生就像一场马拉松比赛,拼的不是起点,而是坚持的耐力和成长的速度.只要努力不止,进步也会不止. 1.ECMAScript 与 JavaScript 的关系? ECMA(E ...

  10. Spring Data JPA应用 之查询分析

    在Spring Data JPA应用之常规CRUD操作初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)尾附上了JpaRepository接口继承关系及方法,可以知道JpaRepos ...