LeetCode题练习与总结:克隆图--133

一、题目描述

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 valint) 和其邻居的列表(list[Node])。

class Node {public int val;public List<Node> neighbors;
}

测试用例格式:

简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。

邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。

给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。

示例 1:

输入:adjList = [[2,4],[1,3],[2,4],[1,3]]
输出:[[2,4],[1,3],[2,4],[1,3]]
解释:
图中有 4 个节点。
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。

示例 2:

输入:adjList = [[]]
输出:[[]]
解释:输入包含一个空列表。该图仅仅只有一个值为 1 的节点,它没有任何邻居。

示例 3:

输入:adjList = []
输出:[]
解释:这个图是空的,它不含任何节点。

提示:

  • 这张图中的节点数在 [0, 100] 之间。
  • 1 <= Node.val <= 100
  • 每个节点值 Node.val 都是唯一的,
  • 图中没有重复的边,也没有自环。
  • 图是连通图,你可以从给定节点访问到所有节点。

二、解题思路

这个问题是图遍历和复制的问题。可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历图。遍历过程中,需要记录已经访问过的节点,以避免重复访问。同时,在复制每个节点时,需要复制它的邻居列表。

具体步骤如下:

1. 检查输入节点是否为空。如果为空,返回null。

2. 创建一个HashMap来存储原始节点和对应的克隆节点,用于避免重复克隆。

3. 使用DFS或BFS遍历图,对于每个访问的节点:

  • 如果该节点已经在HashMap中,说明已经克隆过,直接从HashMap中获取克隆节点。
  • 如果该节点不在HashMap中,创建一个新的克隆节点,并将原始节点和克隆节点的映射关系存入HashMap。
  • 遍历原始节点的邻居列表,对于每个邻居节点,递归地进行克隆操作,并将克隆后的邻居节点添加到克隆节点的邻居列表中。

4. 返回HashMap中存储的输入节点的克隆节点。

三、具体代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;class Solution {public Node cloneGraph(Node node) {if (node == null) {return null;}HashMap<Node, Node> visited = new HashMap<>();return dfs(node, visited);}private Node dfs(Node node, HashMap<Node, Node> visited) {if (visited.containsKey(node)) {return visited.get(node);}Node cloned = new Node(node.val, new ArrayList<>());visited.put(node, cloned);for (Node neighbor : node.neighbors) {cloned.neighbors.add(dfs(neighbor, visited));}return cloned;}
}

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

1. 时间复杂度
  • 对于每个节点,我们只访问一次,因为一旦一个节点被克隆并放入visited哈希表中,我们就不会再次克隆它。
  • 对于每个节点,我们需要遍历其所有的邻居节点,并进行克隆。
  • 假设图中一共有N个节点和E条边,那么每个节点都会被访问一次,每条边也会被访问一次(因为每条边都会使我们在邻居节点之间进行一次转移)。
  • 因此,时间复杂度为O(N + E),其中N是节点数,E是边数。
2. 空间复杂度
  • 我们需要一个visited哈希表来存储已经访问过的节点和它们的克隆节点,这个哈希表的大小与节点数N成正比。
  • 递归调用栈的最大深度取决于图的最大深度,也就是图中的最长路径。在最坏的情况下,图可能是一个链状结构,递归调用栈的深度为N
  • 因此,空间复杂度也是O(N),主要取决于visited哈希表和递归调用栈的空间消耗。

综上所述,该算法的时间复杂度为O(N + E),空间复杂度为O(N)

五、总结知识点

  1. 图的深度优先搜索(DFS):这是一种用于遍历或搜索树或图的算法。在这个算法中,我们从一个节点开始,探索尽可能深的分支,直到目标节点,然后回溯到之前的分支点,探索新的分支。

  2. 递归dfs函数是递归的,它调用自身来处理图的每个节点和它们的邻居。

  3. 哈希表(HashMap)visited是一个哈希表,用于存储已经访问过的节点和它们的克隆。它提供了快速的查找和插入操作,这对于避免重复克隆节点至关重要。

  4. 引用类型和值类型:在Java中,Node是一个引用类型,这意味着visited哈希表中存储的是节点的引用,而不是节点的副本。

  5. 链表(ArrayList)ArrayList用于存储节点的邻居列表。它是一个可调整大小的数组实现,提供了对列表的快速随机访问。

  6. 对象的创建和初始化new Node(node.val, new ArrayList<>())创建了一个新的Node对象,并使用节点值和空的邻居列表进行了初始化。

  7. 迭代for循环用于迭代节点的邻居列表,对每个邻居节点调用dfs函数。

  8. 函数返回值dfs函数返回克隆后的节点,这允许递归调用将克隆的邻居节点添加到当前节点的邻居列表中。

  9. 基础数据结构操作:代码中涉及了哈希表和列表的基本操作,如添加元素(putadd)和检查元素是否存在(containsKey)。

  10. 边界条件处理:代码首先检查输入节点是否为空,这是处理图问题时常见的边界条件。

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

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

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

相关文章

阐述一下Golang中defer的原理

基本用法 在Go语言中&#xff0c;defer关键字用于在函数返回前执行一段代码或调用一个清理函数。这对于处理文件关闭、解锁或者返回一些资源到资源池等操作非常有用。 其基本用法如下所示&#xff1a; package mainimport "fmt"func main() {example() }func exam…

如何使用Rekono结合多种工具自动完成渗透测试

关于Rekono Rekono是一款功能强大的自动化渗透测试工具&#xff0c;该工具能够结合其他多种网络安全工具并以自动化的形式完成整个渗透测试过程。在工具运行的过程中所收集到的数据将通过电子邮件或Telegram同时发送给用户&#xff0c;如果需要更加高级的漏洞管理功能&#xf…

浏览器(Browser):轻量级浏览器,高效浏览新体验

在可的哥桌面&#xff08;Codigger Desktop&#xff09;&#xff0c;我们始终秉持创新精神&#xff0c;致力于提供卓越的用户体验。如今&#xff0c;我们激动地宣布一项全新功能的发布——轻量级浏览器Browser。这款浏览器的推出&#xff0c;正是我们对用户体验追求的再次体现&…

设施布置之车间布局优化SLP分析

一 物流分析&#xff08;Flow Analysis&#xff09; 的基本方法 1、当物料移动是工艺过程的主要部分时&#xff0c;物流分析就是工厂布置设计的核心工作&#xff0c;也是物料搬运分析的开始。 2、零部件物流是该部件在工厂内移动时所走过的路线&#xff0c; 物流分析不仅要考虑…

免费ai写作?这三款软件是你的好帮手!

在信息爆炸的今天&#xff0c;自媒体已成为越来越多人展现自我、分享知识的平台。然而&#xff0c;对于许多自媒体创作者来说&#xff0c;写作过程中的灵感枯竭、文笔不畅等问题常常困扰着他们。幸运的是&#xff0c;随着人工智能技术的飞速发展&#xff0c;免费AI写作软件应运…

2024全国高校名单发布,电子版下载!

今天&#xff0c;教育部网站发布了《全国高等学校名单》。截至2024年6月20日&#xff0c;全国高等学校共计3117所&#xff0c;其中&#xff1a;普通高等学校2868所&#xff0c;含本科学校1308所、高职&#xff08;专科&#xff09;学校1560所&#xff1b;成人高等学校249所。本…

任务4.8.3 利用SparkSQL统计每日新增用户

实战概述&#xff1a;利用SparkSQL统计每日新增用户 任务背景 在大数据时代&#xff0c;快速准确地统计每日新增用户是数据分析和业务决策的重要部分。本任务旨在使用Apache SparkSQL处理用户访问历史数据&#xff0c;以统计每日新增用户数量。 任务目标 处理用户访问历史数…

简单了解雪花算法

雪花算法是什么 不多解释。看一看 具体是怎么 生产 唯一ID 的。 ID 由多个数据组合拼接成64位&#xff0c;分别是 时间戳 服务器节点ID 序列号&#xff0c;每个数据项占的位数不固定&#xff0c;可以根据实际需求设置。首位 1 个二进制位 是 符号位。 public long allocate(l…

数字样机:飞行器状态控制系统仿真

引言&#xff1a;数字样机起源于20世纪90年代&#xff0c;是一种用数字化模型代替实际物理样机进行仿真分析的技术。 传统的飞行器研发流程往往遵循一套特定的循环结构&#xff1a;在设计初期&#xff0c;工程人员需要对飞行器提供一个综合的设计思路&#xff08;初期蓝图&…

Linux【实操篇-文件目录类命令】

05【实操篇-文件目录类命令】 1.pwd 显示当前工作目录的绝对路径 pwd:print working directory 打印工作目录 到现在为止&#xff0c;我们还不知道自己在系统的什么地方。在浏览器上&#xff0c;我们能够通过导航栏上的url&#xff0c;了解到自己在互联网上的具体坐标。相似的…

Linux权限理解

目录 一.权限的概念 二.Linux权限管理 1.文件访问者的分类&#xff08;人&#xff09; 2.文件类型和访问权限&#xff08;事物属性&#xff09; 3.文件权限值的表示方法 4.文件访问权限的相关设置方法 5.修改文件的拥有者 6.修改文件所属组 7.查看或修改文件权限掩码 …

vue3+Vite项目中引入Element plus组件库及基本使用步骤

一、Element Plus组件库介绍 Element Plus组件库饿了么团队为Vue3发布的组件库&#xff0c;它含有丰富的样式&#xff0c;该组件的官网&#xff1a;element-plus。 二、Element Plus组件安装 (1)通过vscode打开创建的vue项目&#xff0c;本文的项目名称为“shop-admin”,打开项…

【CT】LeetCode手撕—415. 字符串相加

目录 题目1- 思路2- 实现⭐415. 字符串相加——题解思路 3- ACM 实现 题目 原题连接&#xff1a;415. 字符串相加 1- 思路 模式识别&#xff1a;字符串相加 逆向遍历过程模拟 数据结构 ① String res &#xff1a;记录res 、② carry 记录进位值① 定义两个整数遍历 nums1 …

51单片机宏定义的例子

代码 demo.c #include "hardware.h"void delay() {volatile unsigned int n;for(n 0; n < 50000; n); }int main(void) {IO_init();while(1){PINSET(LED);delay();PINCLR(LED);delay();}return 0; }cfg.h #ifndef _CFG_H_ #define _CFG_H_// #define F_CPU …

生成模型的两大代表:VAE和GAN

生成模型 给定数据集&#xff0c;希望生成模型产生与训练集同分布的新样本。对于训练数据服从\(p_{data}(x)\)&#xff1b;对于产生样本服从\(p_{model}(x)\)。希望学到一个模型\(p_{model}(x)\)与\(p_{data}(x)\)尽可能接近。 这也是无监督学习中的一个核心问题——密度估计…

python根据excel的文件创建文件夹

这几天要整理一点文档&#xff0c;需要批量生成一些文件夹&#xff0c;&#xff08;其实也可以进一步自动生成各种文档&#xff09;&#xff0c;用到了py的功能&#xff0c;在此记录一下。 1.准备工作 需要两个库支持openpyxl和os 安装 pip install openpyxl2.代码思路 打算…

AI穿戴设备是未来手机的终结者?中国AI商业化的未来预测

AI技术的发展正处于商业化应用的关键阶段&#xff0c;而中国在互联网时代已凭借商业化应用逆袭。AI算法大模型虽强大&#xff0c;但真正普惠民众需与设备深度结合。穿戴式智能设备就成为了新战场&#xff0c;AI算法与穿戴设备结合能释放更大工作效率。私人助理AI将成趋势&#…

锐捷统一上网行为管理与审计系统 static_convert.php 前台RCE漏洞复现

0x01 产品简介 锐捷统一上网行为管理与审计RG-UAC系列是星网锐捷网络有限公司自主研发的上网行为管理与审计产品,具备的上网行为日志审计功能,能够全面、准确、细致的审计并记录多种上网行为日志,包括网页、搜索、外发文件、邮件、论坛、IM等等,并对日志数据进行统计分析,…

gstreamer+qt5实现简易视频播放器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装环境1.QT52.gstreamer 二、代码1.Windows实现 三、测试效果总结 前言 最近在研究mpp&#xff0c;通过gstreamer实现了硬解码&#xff0c;但是我在想我…

ROS实验课(三)

write in advance 此次实验课给我的生活来了沉重的一击&#xff0c;不单单是因为没有做出来&#xff0c;还因为我卡在了 插件 缺失 而无法解决。之前对待实验课&#xff0c;能在操作流程之外有暇思考具体的实现&#xff0c;此次只能记录简单的操作流程部分。 老规矩&#xff…