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

day42 62.不同路径 63. 不同路径 II

 62.不同路径 

思路

机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。

按照动规五部曲来分析:

1.确定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。(并不是步数)

2.确定递推公式

想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]

3.dp数组的初始化

首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条(只能向下向右走),那么dp[0][j]也同理

4.确定遍历顺序

递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。

5.举例推导dp数组

代码

class Solution {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int i = 0; i < n; i++) {dp[0][i] = 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];}}

63. 不同路径 II

思路

注意点:同样只能想右或者向下,遇到障碍物就没有办法走,在初始化的时候障碍物之后的位置无法初始化即为0。

int[][] obstacleGrid     obstacleGrid.length为行数     obstacleGrid[0].length为列数(第一行的元素的数量即为列数)

动规五部曲:

1.确定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

2.确定递推公式

递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)

3.dp数组如何初始化

因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。

但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。

4.确定遍历顺序

从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。

5.举例推导dp数组

代码

   class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;       //行数列数可能会为1,故而不能使用obstacleGrid[1].lengthif (obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1) {return 0;}int[][] dp = new int[m][n];for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {dp[i][0] = 1;}for (int i = 0; i < n && obstacleGrid[0][i] == 0; i++) {dp[0][i] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;}}return dp[m - 1][n - 1];}}

相关文章:

  • Jenkins 自动化部署
  • 微服务项目搭建之技术选型
  • JavaSE(入门)
  • AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.04.25-2024.05.01
  • 【C语言实现TCP通信】
  • linux文件编程api: creat
  • 服务案例|网络攻击事件的排查与修复
  • QLExpress入门及实战总结
  • 【Unity之FGUI】黑神章Fairy GUI控件详解
  • 重生之我要精通JAVA--第六周笔记
  • 【网络层】ICMP 因特网控制协议
  • SQL 优化
  • 数据库多表查询
  • 操作系统 - 计算机系统概述
  • 应急响应-网页篡改-技术操作只指南
  • 时间复杂度分析经典问题——最大子序列和
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Git同步原始仓库到Fork仓库中
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • React-flux杂记
  • React组件设计模式(一)
  • SOFAMosn配置模型
  • Web设计流程优化:网页效果图设计新思路
  • 坑!为什么View.startAnimation不起作用?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 嵌入式文件系统
  • 智能网联汽车信息安全
  • 进程与线程(三)——进程/线程间通信
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​虚拟化系列介绍(十)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (6)设计一个TimeMap
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (Qt) 默认QtWidget应用包含什么?
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十六)Flask之蓝图
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)h264中avc和flv数据的解析
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET微信公众号开发-2.0创建自定义菜单
  • .net中我喜欢的两种验证码
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • .sh
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @RequestMapping处理请求异常
  • [.net] 如何在mail的加入正文显示图片