LeetCode算法题解(动态规划)|LeetCoed62. 不同路径、LeetCode63. 不同路径 II

一、LeetCoed62. 不同路径

题目链接:62. 不同路径
题目描述:

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

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

问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 109
算法分析:
dp数组及下标含义:

可以创建二维的dp[i][j]来表示到达坐标为(i,j)网格的路径数。

递推公式:

对于每一个网格(除最上面那一排和最左边那一列),到达它的方式有两种,一种是从上面那一个网格往下走一步,另一种是从左边那一个网格往右走一步,所以到达该网格的路径是上面那一个网格和左边那一个网格的路径之和,

dp[i][j] = dp[i-1][j]+dp[i][j-1];(i>0&&j>0)

初始化:

初始化最上边那一排和最左边那一列,到达那里的路径都是1。

遍历顺序:

因为每个网格的路径都是由它上边那一个和左边那一个网格决定的,所以从左到右从上到下遍历该二维网格,或者从上到下从左到右遍历都行。

如果结果不准确,请打印dp数组验证。

代码如下:

class Solution {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];//初始化,最上面那一排和最左边那一列的路径都只有一个for(int i = 0; i < n; i++)dp[0][i] = 1;for(int i = 1; i < m; i++)dp[i][0] = 1;for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];//到达右下角每个网格的路径为上面到达上面那一格网格和到达左边那一格网格的路径之和}}return dp[m - 1][n - 1];//返回到达最右下角网格的路径总数}
}

时间复杂度o(n*m),空间复杂度o(n*m);

二、LeetCode63. 不同路径 II

题目链接:63. 不同路径 II
题目描述:

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

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

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

网格中的障碍物和空位置分别用 1 和 0 来表示。

示例 1:

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

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1
算法分析:
dp数组下标含义:

dp[i][j]表示到达坐标为(i,j)的网格的总路径。

初始化:

对于左边那一列,只能有从上往下一条路径,如果上方任意网格当中有障碍物,那么机器人就不可能到达障碍物下方,也就是说障碍物下方的路径为0;

       boolean flag = true;for(int i = 0; i < m; i++) {if(obstacleGrid[i][0] == 1) flag = false;if(flag) dp[i][0] = 1;else dp[i][0] = 0; }

同理,对于最上方的那一行网格,只能有从左往右一条路径,如果左方任意网格当中有障碍物,那么机器人就不可能到达障碍物右方。

 flag = true;for(int i = 0; i < n; i++) {if(obstacleGrid[0][i] == 1) flag = false;if(flag) dp[0][i] = 1;else dp[0][i] = 0;}
递推公式:

如果当前网格有障碍物,那么机器人不可能当前网格,当前网格的路径为0;

如果没有障碍物,那么当前路径的数量就是上一个网格和左边那一个网格的路径之和。

遍历顺序:

从上到下,从左往右依次遍历。

如果结果有误,打印dp数组检查验证。

代码如下:

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m][n];boolean flag = true;for(int i = 0; i < m; i++) {//对于第一列上的网格只能有一条从上往下的路径,如果上方任意一个网格中有障碍物,那么机器人就不可能到达障碍物的下方if(obstacleGrid[i][0] == 1) flag = false;if(flag) dp[i][0] = 1;else dp[i][0] = 0; }flag = true;for(int i = 0; i < n; i++) {//同理对于第一行上的网格只能有一条从左往右的路径,如果左方任意一个网格中有障碍物,那么机器人就不可能到达障碍物的右方。if(obstacleGrid[0][i] == 1) flag = false;if(flag) dp[0][i] = 1;else dp[0][i] = 0;}for(int i = 1; i < m; i++) {for(int j = 1; j < n; j++) {if(obstacleGrid[i][j] == 0) {//如果当前网格没有障碍物,那么到达它的路径就是上面那一个的网格和路左边那一个的网格路径之和dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}else dp[i][j] = 0;//如果当前网格有障碍物,那么到达该网格的路径为0}}return dp[m - 1][n - 1];}
}

总结

二位dp数组有点难度,但只要掌握了递归五部曲不难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/191541.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下运行Jmeter压测

一、在Linux服务器先安装SDK 1、先从官网下载jdk1.8.0_131.tar.gz&#xff0c;再从本地上传到Linux服务器 2、解压&#xff1a;tar -xzf jdk1.8.0_131.tar.gz&#xff0c;生成文件夹 jdk1.8.0_131 3、在/usr/目录下创建java文件夹&#xff0c;再将 jdk1.8.0_131目录移动到/u…

​软考-高级-系统架构设计师教程(清华第2版)【第19章 大数据架构设计理论与实践 (P691~716)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第19章 大数据架构设计理论与实践 &#xff08;P691~716&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

单元测试实战(四)MyBatis-Plus 的测试

为鼓励单元测试&#xff0c;特分门别类示例各种组件的测试代码并进行解说&#xff0c;供开发人员参考。 本文中的测试均基于JUnit5。 单元测试实战&#xff08;一&#xff09;Controller 的测试 单元测试实战&#xff08;二&#xff09;Service 的测试 单元测试实战&am…

Spring学习③__Bean管理

目录 IOC接口ApplicationContext 详解IOC操作Bean管理基于xml方式基于xml方式创建对象基于xml方式注入属性使用set方法进行注入通过有参数的构造进行注入p 名称空间注入&#xff08;了解&#xff09; 基于xml方式注入其他类型属性xml 注入数组类型属性 IOC接口 IOC思想基于IOC…

机器人制作开源方案 | 智能快递付件机器人

一、作品简介 作者&#xff1a;贺沅、聂开发、王兴文、石宇航、盛余庆 单位&#xff1a;黑龙江科技大学 指导老师&#xff1a;邵文冕、苑鹏涛 1. 项目背景 受新冠疫情的影响&#xff0c;大学校园内都采取封闭式管理来降低传染的风险&#xff0c;导致学生不能外出&#xff0c…

原来机械硬盘比内存慢10万倍

我们都知道机械硬盘的速度很慢&#xff0c;内存的速度很快&#xff0c;那么不同存储器之间的差距到底有多大呢&#xff1f; 我们先来看一幅图&#xff1a; CPU访问寄存器的时间是0.3纳秒&#xff0c;访问L1高速缓存的时间是1纳秒&#xff0c;访问L2高速缓存的时间是4纳秒… 秒…

二维码智慧门牌管理系统升级解决方案:门牌聚合,让管理更便捷!

文章目录 前言一、传统门牌管理系统的瓶颈二、地图门牌聚合展示的优势三、地图门牌聚合展示的实现方法四、智慧门牌管理系统的未来发展 前言 随着城市的发展和建设&#xff0c;对于地址信息的管理变得越来越重要。而智慧门牌管理系统作为管理地址信息的重要工具&#xff0c;其…

Selenium自动化测试框架

一.Selenium概述 1.1 什么是框架? 框架&#xff08;framework&#xff09;是一个框子——指其约束性&#xff0c;也是一个架子——指其支撑性。是一个基本概念上的 结构用于去解决或者处理复杂的问题。 框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及…

盘点60个Python各行各业管理系统源码Python爱好者不容错过

盘点60个Python各行各业管理系统源码Python爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 源码下载链接&#xff1a;https://pan.baidu.com/s/1VdAFp4P0mtWmsA158oC-aA?pwd8888 提取码&#xff1a;8888 项目名…

java:IDEA中的Scratches and Consoles

背景 IntelliJ IDEA中的Scratches and Consoles是一种临时的文件编辑环境&#xff0c;用于写一些文本内容或者代码片段。 其中&#xff0c;Scratch files拥有完整的运行和debug功能&#xff0c;这些文件需要指定编程语言类型并且指定后缀。 举例&#xff1a;调接口 可以看到…

GCD:异步同步?串行并发?一文轻松拿捏!

GCD 文章目录 GCD进程线程进程与线程的关系进程与线程的区别 任务&#xff08;执行的代码&#xff09;队列线程与队列的关系 队列任务**同步执行任务&#xff08;sync&#xff09;**辅助方法**异步执行任务&#xff08;async)**总结栅栏任务迭代任务 队列详细属性QoSAttributes…

ARDUINO UNO 12颗LED超酷流水灯效果

效果代码&#xff1a; #define t 30 #define t1 20 #define t2 100 #define t3 50 void setup() { // set up pins 2 to 13 as outputs for (int i 2; i < 13; i) { pinMode(i, OUTPUT); } } /Effect 1 void loop() { effect_1(); effect_1(); effect_…