LeetCode题练习与总结:不同路径Ⅱ--63

一、题目描述

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

二、解题思路

  1. 初始化:dp[0][0]是起始点,如果obstacleGrid[0][0]为0,则dp[0][0] = 1,否则为0。表示没有路径可以到达起点上存在障碍物的网格。
  2. 状态转移方程:对于dp[i][j],它只能由dp[i-1][j](从左边来)和dp[i][j-1](从上边来)转移而来。如果obstacleGrid[i][j]为1,则表示该位置有障碍物,dp[i][j]为0。否则,dp[i][j] = dp[i-1][j] + dp[i][j-1]
  3. 遍历:从左到右,从上到下遍历obstacleGrid,根据状态转移方程更新dp数组。
  4. 结果:最后dp[m-1][n-1]即为从左上角到右下角的不同路径数量。

三、具体代码

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {// 获取网格的行数和列数int m = obstacleGrid.length;int n = obstacleGrid[0].length;// 初始化dp数组,所有元素初始为0int[][] dp = new int[m][n];// 如果起点有障碍物,则直接返回0if (obstacleGrid[0][0] == 1) {return 0;}// 初始化起点为1,表示从起点出发至少有一条路径dp[0][0] = 1;// 遍历网格for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 如果当前位置有障碍物,则跳过if (obstacleGrid[i][j] == 1) {dp[i][j] = 0;continue;}// 从左边来if (i > 0) {dp[i][j] += dp[i-1][j];}// 从上边来if (j > 0) {dp[i][j] += dp[i][j-1];}}}// 返回到达右下角的路径数量return dp[m-1][n-1];}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 外层循环遍历每一行,内层循环遍历每一列,所以总共的循环次数是 m * n,其中 m 是网格的行数,n 是网格的列数。
  • 在每次循环中,代码主要进行的是常数时间的操作,包括数组的读写操作和简单的加法运算。
  • 由于没有嵌套循环或递归调用,且没有额外的复杂操作,所以时间复杂度是 O(m * n)。
2. 空间复杂度
  • 空间复杂度主要由创建的二维数组 dp 决定,其大小为 m * n。
  • dp 数组用于存储到达每个位置的路径数量,这是解决这个问题所需的额外空间。
  • 代码中没有使用其他额外的数据结构或变量,所以空间复杂度是 O(m * n)。

五、总结知识点

1. 二维数组的使用:代码中使用了二维数组 dp 来存储从起点到每个位置的路径数量。这是动态规划问题中常见的数据结构,用于保存问题的子解。

2. 动态规划(Dynamic Programming):这是一个典型的动态规划问题。动态规划是一种通过将问题分解为重叠的子问题,并存储子问题的解(通常是在一个表格中),从而避免重复计算子问题的解的优化技巧。

  • 状态定义:dp[i][j] 表示从左上角到位置 (i, j) 的不同路径数量。
  • 状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]obstacleGrid[i][j] 为 0 时,表示没有障碍物,可以从上方或左方到达当前位置。
  • 初始化:dp[0][0] 为 1,因为起点没有障碍物,且只有一条路径可以到达起点。

3. 条件判断:代码中使用了条件判断来处理障碍物的情况。如果当前位置有障碍物(obstacleGrid[i][j] == 1),则 dp[i][j] 被设置为 0,表示没有路径可以到达该位置。

4. 循环控制:代码使用了两层嵌套的 for 循环来遍历整个网格。外层循环遍历行,内层循环遍历列。这种循环结构适用于处理网格、矩阵等二维结构的问题。

5. 空间复杂度优化:尽管代码中没有直接体现,但在实际应用中,可以考虑使用一维数组来优化空间复杂度,因为 dp[i][j] 只依赖于 dp[i-1][j]dp[i][j-1],不需要整个二维数组 dp

  • 可以通过仅使用两行空间(一个用于当前行,一个用于前一行)来更新路径数量,从而将空间复杂度从 O(m * n) 降低到 O(min(m, n))。

6. 边界条件处理:代码在处理动态规划问题时,特别注意了边界条件。在这个问题中,起点 dp[0][0] 是一个特殊的边界条件,如果起点有障碍物,则没有路径可以到达,直接返回 0。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

我企业的业务需要制作企业网站吗?11个支持的理由以及5个反对的理由!

如果你的企业经营得还不错&#xff0c;你可能会找出很多理由&#xff0c;说明为什么一个高效的网站对你来说并不那么重要。确实&#xff0c;你明白企业需要在互联网上有一定的存在感&#xff0c;但你可能并不认为一个高效的网站会对你的特定业务产生太大的影响——尤其是当你已…

【Linux】Socket编程接口 | 实现简单的UDP网络程序

文章目录 一、预备知识理解源IP地址和目的IP地址理解源mac地址和目的mac地址认识端口号理解源端口号和目的端口号理解“端口号&#xff08;PORT&#xff09;”和“进程ID&#xff08;PID&#xff09;” 认识TCP和UDP协议TCP协议UDP协议 网络字节序为什么网络字节序采用的是大端…

循环单链表算法库

学习贺老师数据结构 数据结构之自建算法库——循环单链表_循环单链表 csdn-CSDN博客​​​​​​ 整理总结出的循环单链表算法库 v1.0 : 基本实现功能 v2.0(2024.4.6): 修复Delete_SpecificLocate_CyclicList()删除节点函数bug,添加验证删除节点是否超范围判断 目录 1.主要功能…

react17中配置webpack:使用@代表src目录

在vue的项目中可以使用表示src目录&#xff0c;使用该符号表示绝对路径&#xff0c;那么在react中想要使用怎么办呢&#xff1f; 在react中使用表示src目录是需要在webpack中配置的&#xff0c;在核心模块node_modules-》react-scripts-》config-》webpack.config.js中搜索找到…

【数据结构与算法】之8道顺序表与链表典型编程题心决!

个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 目录 1、顺序表 1.1 合并两个有序数组 1.2 原地移除数组中所有的元素va…

51-37 由浅入深理解 Stable Diffusion 3

2024年3月5日&#xff0c;Stability AI公开Stable Diffusion 3论文&#xff0c;Scaling Rectified Flow Transformers for High-Resolution Image Synthesis。公司像往常一样承诺后续将开源代码&#xff0c;开源之光&#xff01;&#xff01;&#xff01; 在LDW潜在扩散模型论文…

​​​​网络编程学习探索系列之——广播原理剖析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之广播原理剖析&#xff0c;在这篇文章中&#xff0c; 你将会学习到如何在网络编程中利用广播来与局域网内加入某个特定广播组的主机&#xff01; 希望这篇文章能对你有所帮助&#xff0c;大家要是觉得我写…

Leetcode算法训练日记 | day24

一、组合问题 1.题目 Leetcode&#xff1a;第 77 题 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4…

福建单航次最大批量汽车“出海”

3月12日这一天&#xff0c;在福州海关的严密监管下&#xff0c;共有4000辆上汽名爵品牌的汽车被高效有序地装载到“安吉智慧”号滚装船上&#xff0c;这批车辆即将启程前往荷兰、埃及、英国等多个海外市场。在这批出口汽车中&#xff0c;新能源车型占据了显著的比例&#xff0c…

OceanMind海睿思助力企业“数据入表”经济利益流入与生命周期管理

通过多年信息系统的建设与应用&#xff0c;企业积累了大量的数据。同时随着时间的推进&#xff0c;数据规模正以加速度快速增长。从国家到企业&#xff0c;都越来越关注所拥有的数据资源及其蕴含的深厚价值。很多企业已经逐渐认知到数据是重要的战略资源&#xff0c;数据资产化…

游标的定义和类型

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 游标的基本概念 游标从字面上理解为游动的光标&#xff0c;可以使用 Excel 表格来想象游标的作用&#xff0c;游标指向每一行&#xff0c;通过游标访问每行数据。 在 Orac…

2024/4/5—力扣—字符串相乘

代码实现&#xff1a; 方法一&#xff1a;常规解法——超出整数表示范围 long long char_to_num(char *str) {long long num 0;for (int i 0; i < strlen(str); i) {num num * 10 (str[i] - 0);}return num; }char* multiply(char *num1, char *num2) {long long a cha…

Git基础操作及其分支管理

目录 一、git的用处&#xff1f; 1.1 git也不是银弹 二、安装git 三、git基础操作 3.1 创建git本地仓库 3.2 配置Git 3.3 认识工作区、暂存区、版本库 3.4 添加文件 3.5 Git文件目录 3.6 版本回退 3.7 撤销修改 3.7.1 对于工作区的代码&#xff0c;还没有进行add操作…

学习51单片机必备:从电子基础到编程技巧全解析

学习51单片机需要掌握一系列的基础知识和技能&#xff0c;以下是一些主要的学习内容&#xff1a; 电子基础知识 了解基本的电子元件和电路原理是学习单片机的基础。这有助于理解单片机如何与外围设备交互以及如何设计电路。 数字逻辑 理解数字逻辑和布尔代数&#xff0c;对于编…

Redis性能管理和集群的三种模式(二)

一、Redis集群模式 1.1 redis的定义 redis 集群 是一个提供高性能、高可用、数据分片、故障转移特性的分布式数据解决方案 1.2 redis的功能 数据分片&#xff1a;redis cluster 实现了数据自动分片&#xff0c;每个节点都会保存一份数据故障转移&#xff1a;若个某个节点发生故…

探索柔性负荷在综合能源系统中的优化调度策略

柔性负荷&#xff0c;指的是那些可以根据系统需求和市场信号调整其使用模式的负荷。它们包括可平移负荷、可转移负荷和可削减负荷。这些负荷的灵活性为IES&#xff08; Integrated Energy System, 综合能源系统&#xff09;提供了额外的调节能力&#xff0c;有助于平衡供需、提…

MyBatis实例更新

MyBatis具体 准备工作 预编译SQL 新增 更新 查询 //查询员工Select("select * from emp where id #{id}")public Emp getById(Integer id);//方案一:给字段起别名&#xff0c;让别名与实体类属性一致Select("select id,username,password,name,gender,image,j…

DataX案例,MongoDB数据导入HDFS与MySQL

【尚硅谷】Alibaba开源数据同步工具DataX技术教程_哔哩哔哩_bilibili 目录 1、MongoDB 1.1、MongoDB介绍 1.2、MongoDB基本概念解析 1.3、MongoDB中的数据存储结构 1.4、MongoDB启动服务 1.5、MongoDB小案例 2、DataX导入导出案例 2.1、读取MongoDB的数据导入到HDFS 2…

Failed to load dll

Unity运行时提示 dll 加载失败 Plugins: Failed to load ‘Assets/Plugins/xxx.dll’ because one or more of its dependencies could not be loaded. 使用 Dependency Walker 查看这个 dll 引用&#xff0c;一推引用丢失 最后确认是 C 组件缺失 打开 Visual Studio Install…

Java基础入门--第十一章--JDBC(Java Database Connection)Java数据库连接

JDBC 11.1 什么是JDBC11.1.1 JDBC概述11.1.2 JDBC驱动程序 11.2 JDBC的常用API11.3 JDBC编程11.3.1 JDBC 编程步骤11.3.2 实现第一个JDBC程序 我的MySQL的root密码: root 11.1 什么是JDBC 11.1.1 JDBC概述 JDBC的全称是Java数据库连接&#xff08;Java Database Connectivit…