leetcode133:克隆图

news/2025/1/25 16:40:26

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

图中的每个节点都包含它的值 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 都是唯一的,
  • 图中没有重复的边,也没有自环。
  • 图是连通图,你可以从给定节点访问到所有节点。

步骤1:问题分析

问题性质

我们需要实现一个无向图的深拷贝(克隆)。无向图以邻接列表的形式表示,其中每个节点包含一个值和一组邻居节点的引用。目标是将给定图的节点及其关系完全复制到一个新图中。

输入
  • 图是连通的。
  • 每个节点有唯一的值 val,其范围在 [1, 100]
  • 使用邻接列表表示图。
输出
  • 返回克隆后的图,确保克隆图与原图结构一致。
边界条件
  1. 图为空(adjList = [])。
  2. 图仅有一个节点且没有邻居(adjList = [[]])。
  3. 图有多个节点,包含复杂的互连关系。
限制
  • 图节点数范围 [0, 100]
  • 无重复边,无自环。

步骤2:解题思路与算法设计

算法设计

我们采用 深度优先搜索(DFS)广度优先搜索(BFS) 来遍历图,同时构建新图。以下是具体思路:

  1. 使用哈希表记录原图节点与克隆节点的映射,以避免重复克隆。
  2. 遍历原图节点,对于每个节点:
    • 如果未克隆,创建新节点并存储到哈希表中。
    • 遍历其邻居,将邻居添加到克隆节点的邻居列表中。
  3. 返回克隆的起始节点。
时间复杂度与空间复杂度
  • 时间复杂度:O(V + E),其中 V 是节点数,E 是边数。我们遍历每个节点和边一次。
  • 空间复杂度:O(V)`,存储节点与克隆节点的映射。

步骤3:代码实现

// 定义图的节点结构
class Node {
public:int val;vector<Node*> neighbors;Node() {val = 0;neighbors = vector<Node*>();}Node(int _val) {val = _val;neighbors = vector<Node*>();}Node(int _val, vector<Node*> _neighbors) {val = _val;neighbors = _neighbors;}
};class Solution {
public:// 哈希表用于存储原图节点到克隆节点的映射unordered_map<Node*, Node*> visited;// 深度优先搜索方法Node* cloneGraph(Node* node) {// 如果输入为空,直接返回空if (!node) return nullptr;// 如果当前节点已经被克隆,直接返回克隆节点if (visited.find(node) != visited.end()) {return visited[node];}// 克隆当前节点(仅复制值,不复制邻居)Node* clone = new Node(node->val);visited[node] = clone; // 保存映射// 克隆邻居节点并添加到克隆节点的邻居列表for (Node* neighbor : node->neighbors) {clone->neighbors.push_back(cloneGraph(neighbor));}return clone;}
};

步骤4:启发

  • 递归与迭代:克隆无向图展示了递归(DFS)与迭代(BFS)遍历的实际应用。
  • 哈希表的作用:哈希表有效解决了重复计算与循环依赖问题。

步骤5:实际应用场景

  • 社交网络分析:克隆图算法可用于复制社交网络结构,便于离线分析。

    • 示例:社交平台需要克隆用户好友关系图并在克隆图上测试推荐算法。
    • 实现:根据用户关系图构建克隆图,执行分析算法如 Pagerank。
  • 路径规划:在交通网络中,克隆图可用于模拟不同情况下的路网变化。

    • 示例:复制城市路网并模拟封路或新增路线对整体交通的影响。

https://dhexx.cn/news/show-5468808.html

相关文章

吉林大学23级数据结构上机实验(第7周)

A 去火车站 寒假到了&#xff0c;小明准备坐火车回老家&#xff0c;现在他从学校出发去火车站&#xff0c;CC市去火车站有两种方式&#xff1a;轻轨和公交车。小明为了省钱&#xff0c;准备主要以乘坐公交为主。CC市还有一项优惠政策&#xff0c;持学生证可以免费乘坐一站轻轨&…

buuctf:被嗅探的流量

解压后用wireshark查看 flag{da73d88936010da1eeeb36e945ec4b97}

大模型Qwen面试内容整理-模型架构与原理

Qwen(通义千问)是阿里巴巴推出的大规模语言模型,其架构和原理与当前主流的大模型(如GPT、LLaMA等)有很多相似之处,但也具备一些独特的特点。下面是Qwen模型架构和原理的详细介绍: Transformer 架构 Qwen模型基于改进的 Transformer 架构,这是一种广泛用于自然语言处理(…

Luma 视频生成 API 对接说明

Luma 视频生成 API 对接说明 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的视频。 Luma 是一个专业高质量的视频生成平…

plsql 执行存储过程 SYS_REFCURSOR

关键字&#xff1a;plsql 执行存储过程 SYS_REFCURSOR 在PL/SQL中&#xff0c;SYS_REFCURSOR是一种特殊的数据类型&#xff0c;用于表示引用游标&#xff0c;可以用来返回查询结果或者操作数据库中的结果集。 以下是一个使用SYS_REFCURSOR执行存储过程的例子&#xff1a; CR…

c++总复习

1. 什么是封装性 封装性&#xff08;Encapsulation&#xff09;是面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;中的一个重要概念&#xff0c;它指的是将数据&#xff08;通常是类的成员变量&#xff09;和操作这些数据的方法&#xff08;…

Cursor vs VSCode:主要区别与优势分析

Cursor - The AI Code Editor 1. AI 集成能力 Cursor的优势 原生AI集成&#xff1a; # Cursor可以直接通过快捷键调用AI # 例如&#xff1a;按下 Ctrl K 可以直接获取代码建议 def complex_function():# 在这里&#xff0c;你可以直接询问AI如何实现功能# AI会直接在编辑器中…

网络编程(UDP\TCP回显服务器)

目录 套接字socket TCP和UDP特点比较 特点 比较 UDP回显服务器/客户端的编写 UDP的socket api 回显服务器 客户端 TCP回显服务器/客户端的编写 TCP的socket api 回显服务器 客户端 优化服务器 1.关闭服务器创建的socket对象 2.引入线程池&#xff0c;为多个客户…

大语言模型应用Text2SQL本地部署实践初探

自从两年前OpenAI公司发布ChatGPT后&#xff0c;大模型(Large Language Model&#xff0c;简称LLM)相关技术在国内外可谓百家争鸣&#xff0c;遍地开花&#xff0c;在传统数据挖掘、机器学习和深度学习的基础上&#xff0c;正式宣告进入快速发展的人工智能(Artificial Intellig…

pushgateway HA高可用方案

未经本人同意不得转载&#xff0c;若引用请附上原文链接。 项目使用flink来处理kafka中的无界流数据&#xff0c;采用的是flink on yarn的模式部署flink任务。最近做flink任务的监控过程中&#xff0c;踩了一些坑。下面是过程&#xff0c;只想看最终方案的直接拉到最后。 先说…