当前位置: 首页 > news >正文

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数组有点难度,但只要掌握了递归五部曲不难。

相关文章:

  • 软考高项知识点 安全技术
  • 【Django-02】 Model模型和模型描述对象Meta
  • ubuntu 20.04安装 Anaconda教程
  • 01 DDD小传:领域驱动设计为什么这么火?
  • python接口自动化测试之接口数据依赖
  • 【python学习】基础篇-常用函数-sorted() 对可迭代对象进行排序
  • clusterProfiler包学习
  • 人工智能基础_机器学习040_Sigmoid函数详解_单位阶跃函数与对数几率函数_伯努利分布---人工智能工作笔记0080
  • Windows10下Maven3.9.5安装教程
  • 泛型编程:进阶的正确打开方式
  • Android WMS——输入系统管理(十七)
  • jmeter接口自动化部署jenkins教程详解
  • KT142C语音芯片搭配HAA2018功放,两个板子,一个声音正常一个没有声音
  • Apahce虚拟主机配置演示
  • 169. 多数元素 --力扣 --JAVA
  • 3.7、@ResponseBody 和 @RestController
  • java2019面试题北京
  • js 实现textarea输入字数提示
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 三分钟教你同步 Visual Studio Code 设置
  • 线性表及其算法(java实现)
  • 延迟脚本的方式
  • 一份游戏开发学习路线
  • 一个JAVA程序员成长之路分享
  • 自动记录MySQL慢查询快照脚本
  • 仓管云——企业云erp功能有哪些?
  • 从如何停掉 Promise 链说起
  • 湖北分布式智能数据采集方法有哪些?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #{}和${}的区别是什么 -- java面试
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #在 README.md 中生成项目目录结构
  • $.ajax()
  • (42)STM32——LCD显示屏实验笔记
  • (C)一些题4
  • (C语言)fgets与fputs函数详解
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (转)h264中avc和flv数据的解析
  • (转)http协议
  • (转)创业家杂志:UCWEB天使第一步
  • ***检测工具之RKHunter AIDE
  • .apk文件,IIS不支持下载解决
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net MVC4 上传大文件,并保存表单
  • .NET 服务 ServiceController
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @RequestBody的使用
  • [ACTF2020 新生赛]Upload 1
  • [AX]AX2012 SSRS报表Drill through action
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [C++]打开新世界的大门之C++入门