代码随想录刷题笔记 DAY 38 | 不同路径 No.62 | 不同路径II No.63

文章目录

    • Day 38
      • 01. 不同路径(No. 62)
        • <1> 题目
        • <2> 笔记
        • <3> 代码
      • 02. 不同路径(No. 63)
        • <1> 题目
        • <2> 笔记
        • <3> 代码

Day 38

01. 不同路径(No. 62)

题目链接

代码随想录题解

<1> 题目

一个机器人位于一个 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
<2> 笔记

在尝试使用递归去解题的时候,先去尝试确定一个可以转移的 状态

题目中问的是共有多少条路径,那是不是可以尝试将到达某个节点的方法种数作为状态呢?

再来思考这个状态能否可以转移呢?因为机器人 只能 往下和往右移动,所以到达一个节点的方式是可以依据这个节点的上面和左边推导而来的;这样 状态转移方程 也较为容易的能列出。

既然某个节点的状态需要右边和上面列出,那必须要保证一开始最上面那一行和最左边那一列是初始化的,既然机器人只能 向下向右 移动,那这两列都可以初始化为 1 ,因为到达这两个位置的任意一个节点都只有 一种方法

那最左上角的节点初始化成什么呢?答案是初始化成什么都可以,因为在遍历其他节点的时候根本用不到这个节点的值!

来用动态规划五部曲总结一下思路:

🍀 dp 数组的含义:到达下表为 [i, j] 的节点有 dp[i][j] 种方法。

🍀 确定递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],即到达一个节点的方法等于到达这个节点上方的节点的方法加上到达这个节点左方的方法加和。

🍀 dp 数组的初始化:和上面提到的相同

🍀 确定遍历顺序:因为某个节点的结果需要上方和左方的推导,所以遍历顺序是从上到下,从左到右的。

🍀 举例推导 dp 数组

<3> 代码
class Solution {public int uniquePaths(int m, int n) {int[][] map = new int[m][n];for (int i = 0; i < n; i++) {map[0][i] = 1;}for (int i = 0; i < m; i++) {map[i][0] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {map[i][j] = map[i - 1][j] + map[i][j - 1];}}return map[m - 1][n - 1];}
}

02. 不同路径(No. 63)

题目链接

代码随想录题解

<1> 题目

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

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

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

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

示例 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]01
<2> 笔记

有了上题的经验思考本题就变得容易了许多,本题在原本的基础上加上了 阻碍 这个特性,但其实对 整体的思路 是没有影响的,这也就代表了 dp 数组的 含义 不需要再去重新确认。

那这道题只需要思考这个阻碍物对 dp 数组的初始化会不会有影响呢?机器人只能往右边和往下面走,所以最左边那一列一旦出现了阻碍,那剩余的部分均是无法到达的。

所以如果这一条路径上出现了阻碍,剩余的部分 应该全部初始化为 0

		for (int i = 0; i < m; i++) {if (obstacleGrid[i][0] == 0) {map[i][0] = 1;} else {break; // 直接 break 出去,剩余的部分就不赋值为 1 了}}for (int i = 0; i < n; i++) {if (obstacleGrid[0][i] == 0) {map[0][i] = 1;} else {break;}}

对于状态转移方程也要做一些调整,因为 障碍物永远是不可达的 所以所有障碍物的位置都要变为 0

if (obstacleGrid[i][j] == 0) {// 对不为 0 的部分也就是障碍物不做处理,默认为 0map[i][j] = map[i - 1][j] + map[i][j - 1];
}

思考一下已经没有其他的影响了,写出代码。

<3> 代码
class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] map = new int[obstacleGrid.length][obstacleGrid[0].length];// dp 数组的初始化for (int i = 0; i < m; i++) {if (obstacleGrid[i][0] == 0) {map[i][0] = 1;} else {break;}}for (int i = 0; i < n; i++) {if (obstacleGrid[0][i] == 0) {map[0][i] = 1;} else {break;}}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 0) {// 只遍历不为障碍物的部分map[i][j] = map[i - 1][j] + map[i][j - 1];}}}return map[m - 1][n - 1];}
}

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

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

相关文章

Redis安全加固策略:服务账号管理 开启redis密码认证 开启防护模式

Redis安全加固策略&#xff1a;服务账号管理 & 开启redis密码认证 & 开启防护模式 1.1 服务账号管理1.1.1 检测方法1.1.2 加固参考配置操作 1.2 开启redis密码认证1.2.1 检测方法1.2.2 加固参考配置操作 1.3 开启防护模式1.3.1 检测方法1.3.2 加固参考配置操作 &#x…

Ubuntu进入python时报错:找不到命令 “python”,“python3” 命令来自 Debian 软件包 python3

一、错误描述 二、解决办法 进入”/usr/bin”目录下&#xff0c;查看/usr/bin目录中所有与python相关的文件和链接&#xff1a; cd /usr/bin ls -l | grep python 可以看到Python3指向的是Python3.10&#xff0c;而并无指向python3的软连接 只需要在python与python3之间手动…

【C++提高编程】

C提高编程 C提高编程1 模板1.1 模板的概念1.2 函数模板1.2.1 函数模板语法1.2.2 函数模板注意事项1.2.3 函数模板案例1.2.4 普通函数与函数模板的区别1.2.5 普通函数与函数模板的调用规则1.2.6 模板的局限性 1.3 类模板1.3.1 类模板语法1.3.2 类模板与函数模板区别1.3.3 类模板…

信息检索(七):Transformer Memory as a Differentiable Search Index

Transformer Memory as a Differentiable Search Index 摘要1. 引言2. 相关工作3. 可微搜索索引3.1 索引策略3.1.1 索引方法3.1.2 文档表示策略 3.2 用于检索的 Docids 表示3.3 训练和优化 4. 实验4.1 基线4.2 实验结果 5. 结论参考资料 原文链接&#xff1a;https://proceedin…

linux的通信方案(SYSTEM V)

文章目录 共享内存(Share Memory)信号队列&#xff08;Message Queue&#xff09;信号量(semaphore) 进程间通信的核心理念&#xff1a;让不同的进程看见同一块资源 linux下的通信方案&#xff1a; SYSTEM V 共享内存(Share Memory) 特点&#xff1a;1.共享内存是进程见通信最…

VBA数据库解决方案第九讲:打开数据库记录集,所得数据回填

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

【二分】第k个缺失的数

第K个缺失的数 链接 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/kth-missing-positive-number/ 题目 题解 二段…

VirtualBox 桥接网卡 未指定 “未能启动虚拟电脑Ubuntu,由于下述物理网卡未找到:”

解决办法&#xff0c;安装虚拟网卡&#xff0c;win11查找方式&#xff1a;控制面板→网络和共享中心→更改适配器设置 此时出现下面情况就算安装成功 但是如果报错&#xff1a;找不到指定的模块 则按下面步骤删除干净垃圾重新上面操作 先安装CCleaner, 链接:CCleaner Makes Y…

QT6 libModbus 用于ModbusTcp客户端读写服务端

虽然在以前的文章中多次描述过,那么本文使用开源库libModbus,可得到更好的性能&#xff0c;也可移植到各种平台。 性能&#xff1a;读1次和写1次约各用时2ms。 分别创建了读和写各1个连接指针&#xff0c;用于读100个寄存器和写100个寄存器&#xff0c;读写分离。 客户端&am…

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读

Grid-Based Continuous Normal Representation for Anomaly Detection 论文阅读 摘要简介方法3.1 Normal Representation3.2 Feature Refinement3.3 Training and Inference 4 实验结果5 总结 文章信息&#xff1a; 原文链接&#xff1a;https://arxiv.org/abs/2402.18293 源码…

二、IO接口时序分析基本原理和意义

前言&#xff1a;前面内容介绍了时序分析的基本原理&#xff0c;着重学习了芯片内部的两级寄存器之间的时序分析模型&#xff0c;本篇内容针对IO部分的时序分析模型展开讨论讲解。 文章目录 一、IO接口时序分析的基本模型&#xff08;源同步&#xff09;二、INPUT DELAY 时序分…

java-ssm-jsp-宠物护理预定系统

java-ssm-jsp-宠物护理预定系统 获取源码——》公主号&#xff1a;计算机专业毕设大全