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,一经查实,立即删除!

相关文章

自动化运维(二十四)Ansible 实战查找插件和策略插件

Ansible 支持多种类型的插件&#xff0c;这些插件可以帮助你扩展和定制 Ansible 的功能。每种插件类型都有其特定的用途和应用场景。今天我们一起学习查找插件和策略插件。 一、查找插件&#xff08;Lookup Plugins&#xff09; Ansible 查找插件允许用户从外部数据源或在 An…

我企业的业务需要制作企业网站吗?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;大家要是觉得我写…

c#中怎么自动下载软件

以下是一个简单的 C# 示例&#xff0c;演示如何使用 WebClient 类下载软件&#xff1a; using System; using System.Net; class Program { static void Main(string[] args) { // 要下载的文件 URL string fileUrl "https://example.com/path/to/file"; // 本地保…

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…

java中的Optional类和线程

Optional类&#xff1a; public static <T> Optional<T> of(T value) Returns an Optional describing the given non-null value. 通过非null值构建一个Optional容器&#xff0c;注意value不能为null&#xff0c;否则抛出异常 public static <T> Optional&…

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

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

PostgreSQL高级sql积累

1&#xff1a;----查询postgresql数据中系统表与自己建立表结构做了个对比 select cl.relname,att.attname,att.atttypid,f.* from pg_class cl LEFT JOIN pg_attribute att on att.attrelid cl.oid LEFT JOIN td_f_field_info f on f.party_table_namecl.relname and f.fi…

[运维|GB28181] wvp-GB28181-pro+ZLMediaKit部署GB28181协议视频平台(windows)-个人笔记

相关软件下载地址 mysql下载地址 redis下载地址 vc运行库 linux安装说明 wvp-GB28181-proZLMediaKit部署GB28181协议视频平台全流程(ubuntu2204) wvp-GB28181-proZLMediaKit部署GB28181协议视频平台全流程(centos7) 若需要协助部署可私信我

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

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

游标的定义和类型

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

UVA10391 Compound Words 复合词 解题报告

UVA10391 Compound Words 复合词 解题报告 题目链接 https://vjudge.net/problem/UVA-10391 题目大意 给出一个词典&#xff0c;找出所有的复合词&#xff0c;即恰好有两个单词连接而成的单词。输入每行都是一个由小写字母组成的单词。输入已按照字典序从小到大排序&#xf…

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…

“Python爬虫实战:高效获取网上公开美图“

如何通过Python创建一个简单的网络爬虫&#xff0c;以爬取网上的公开图片。网络爬虫是一种自动化工具&#xff0c;能够浏览互联网、下载内容并进行处理。请注意&#xff0c;爬取内容时应遵守相关网站的使用条款&#xff0c;尊重版权和隐私权。 ### 网络爬虫简介 网络爬虫&…

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操作…