学习记录:js算法(九十二):克隆图

news/2024/11/14 7:16:59/

文章目录

    • 克隆图
      • 思路一

克隆图

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。

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

测试用例格式:
简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。
邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。
给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。

图一:
在这里插入图片描述

图二:
在这里插入图片描述

输入:adjList = [[2,4],[1,3],[2,4],[1,3]]
输出:[[2,4],[1,3],[2,4],[1,3]]
解释:
图中有 4 个节点。
节点 1 的值是 1,它有两个邻居:节点 24 。
节点 2 的值是 2,它有两个邻居:节点 13 。
节点 3 的值是 3,它有两个邻居:节点 24 。
节点 4 的值是 4,它有两个邻居:节点 13 。示例 2:
输入:adjList = [[]]
输出:[[]]
解释:输入包含一个空列表。该图仅仅只有一个值为 1 的节点,它没有任何邻居。示例 3:
输入:adjList = []
输出:[]
解释:这个图是空的,它不含任何节点。

思路一

var cloneGraph = function(node) {if (node === null) return null;const visited = new Map();function dfs(originalNode) {if (visited.has(originalNode)) {return visited.get(originalNode);}const cloneNode = new Node(originalNode.val, []);visited.set(originalNode, cloneNode);for (const neighbor of originalNode.neighbors) {cloneNode.neighbors.push(dfs(neighbor));}return cloneNode;}return dfs(node);
};

讲解
使用深度优先搜索(DFS)来解决图的克隆问题。其主要思路是递归地遍历图中的每个节点,并在遍历过程中创建节点的克隆版本。为了避免重复克隆相同的节点,使用了一个 Map 结构 visited 来存储已经克隆过的节点,以节点的引用为键,克隆后的节点为值。

  1. 初始化:创建一个 Map 叫做 visited,用于存储已经克隆过的节点。如果图中存在循环,或者有多个节点指向同一个节点,这个 Map 可以防止无限循环和重复克隆。
  2. 定义 DFS 函数:dfs(originalNode) 函数负责克隆 originalNode 及其所有邻居节点。
  3. 检查是否已克隆:在 dfs 函数内部,首先检查 originalNode 是否已经在 visited 中。如果是,直接返回对应的克隆节点,避免重复工作。
  4. 创建克隆节点:如果 originalNode 尚未被克隆,创建一个新的 Node 实例,将其值设置为 originalNode.val,并将邻居列表初始化为空数组。
  5. 存储克隆节点:将 originalNode 和其克隆版本的映射存储在 visited 中。
  6. 克隆邻居:遍历 originalNode 的所有邻居,对每个邻居调用 dfs 函数来获取其克隆版本,并将这些克隆版本添加到当前克隆节点的邻居列表中。
  7. 返回克隆节点:最后,dfs 函数返回当前克隆节点的引用。
  8. 启动克隆过程:在 cloneGraph 函数外部,调用 dfs(node) 来开始克隆过程。node 是要克隆的图的起始节点。

关键点:
● 使用 Map 来跟踪已经克隆的节点,防止重复克隆和无限循环。
隆。
● 每个克隆节点的邻居列表是在克隆过程中动态构建的,确保了克隆图的结构与原图完全一致。
这种方法的时间复杂度为 O(V+E),其中 V 是节点数,E 是边数。这是因为每个节点和每条边都会被访问一次。空间复杂度也为 O(V+E),主要是由于递归调用栈和 visited Map 的使用。


http://www.ppmy.cn/news/1546593.html

相关文章

Linux中开启 Vim 之旅:从快捷键到插件的实用手册

文章目录 1. vim 的主要特点2. vim 的基本使用模板3. vim的基本操作4. vim正常模式命令集5. vim末行模式命令集6. 简单vim配置 vim 是 Linux 系统中非常强大的文本编辑器之一&#xff0c;全称为 “Vi IMproved”。它是 vi 编辑器的增强版&#xff0c;提供了更加丰富的功能&…

深度学习——AE、VAE

&#x1f33a;历史文章列表&#x1f33a; 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…

sql表的约束练习题

1. 如何创建一个包含非空约束的表&#xff1f; A. CREATE TABLE t01(id integer, name text, score numeric); B. CREATE TABLE t01(id integer NOT NULL, name text, score numeric); C. CREATE TABLE t01(id integer UNIQUE, name text, score numeric); D. CREA…

装杯 之 Linux指令【补充篇】

“生活就像海洋&#xff0c;只有意志坚强的人&#xff0c;才能到达彼岸” ---马克思 目录 1.grep指令 ​编辑 2.zip/unzip指令 3.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#xff0c;不打开它&#xff0c;直接看内容 4.bc指令 5.uname 指令 1.grep…

YOLOv8改进 | 利用YOLOv8进行视频划定区域目标统计计数

简介 本项目旨在利用YOLOv8算法来实现视频中划定区域目标的统计计数。YOLOv8是一种目标检测算法,能够实现实时目标检测和定位。视频划定区域目标统计计数是指在一个视频中,对于指定的区域,统计出该区域内出现的目标物体数量。 该项目的工作流程如下:首先,利用YOLOv8算法…

hive表批量造数据

目录 1 . 使用 INSERT INTO 从已有表批量插入数据2. 使用 INSERT OVERWRITE 从文件或目录导入数据3. 使用 Hive 中的 SELECT 语句生成数据4. 使用 RAND() 或 UUID() 生成随机数据5. 使用 hive 的自定义 UDF 生成批量数据6. 使用 Python 脚本结合 Hive 进行数据生成7. 使用 hive…

硬件---4电感---基本概念与特性

一电感是什么 1电感的概念 电感就是一根导线加一个磁性原料。生活中&#xff0c;所有由线圈组成的器件都是电感。 如下图&#xff0c;常见的电感封装&#xff0c;有裸露的也有贴片的。 二电感的基本特性 1流过电感的电流不能发生突变 注意和电容的区别&#xff0c;一个是…

SQL面试题——飞猪SQL面试 重点用户

飞猪SQL面试题—重点用户 在一些场景中我们经常听到这样的一些描述&#xff0c;例如20%的用户贡献了80%的销售额&#xff0c;或者是20%的人拥有着80%的财富&#xff0c;你知道这样的数据是怎么算出来的吗 数据如下,uid 是用户的id ,amount是用户的消费金额 |uid|amount| ---…