深圳个性化网站建设公司,编写一个android应用程序,农村做网站赚钱,好的网站模板克隆图
https://leetcode.cn/problems/clone-graph/description/
描述 给你无向 连通 图中一个节点的引用#xff0c;请你返回该图的 深拷贝#xff08;克隆#xff09;。 图中的每个节点都包含它的值 val#xff08;int#xff09; 和其邻居的列表#xff08;list[No…克隆图
https://leetcode.cn/problems/clone-graph/description/
描述 给你无向 连通 图中一个节点的引用请你返回该图的 深拷贝克隆。 图中的每个节点都包含它的值 valint 和其邻居的列表list[Node]。 class Node {public int val;public ListNode neighbors;
}测试用例格式 简单起见每个节点的值都和它的索引相同。例如第一个节点值为 1val 1第二个节点值为 2val 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 []
输出[]
解释这个图是空的它不含任何节点。示例 4 输入adjList [[2],[1]]
输出[[2],[1]]提示
节点数不超过 100 。每个节点值 Node.val 都是唯一的1 Node.val 100。无向图是一个简单图这意味着图中没有重复的边也没有自环。由于图是无向的如果节点 p 是节点 q 的邻居那么节点 q 也必须是节点 p 的邻居。图是连通图你可以从给定节点访问到所有节点。
算法实现
1 深度优先遍历
/*** Definition for Node.* class Node {* val: number* neighbors: Node[]* constructor(val?: number, neighbors?: Node[]) {* this.val (valundefined ? 0 : val)* this.neighbors (neighborsundefined ? [] : neighbors)* }* }*/// 深度优先遍历方法
function cloneGraph(node: Node | null): Node | null {if(!node) return;const visited new Map(); // 记录哪些节点被访问以及节点的映射关系const dfs (n: Node | null) {// console.log(n.val);let nCopy new Node(n.val); // 克隆了一个节点visited.set(n, nCopy); // 将每个拷贝的节点和之前的节点做一个映射的关系// 空数组的forEach不会执行(n.neighbors || []).forEach(ne {if(!visited.has(ne)) {dfs(ne);}nCopy.neighbors.push(visited.get(ne));});};dfs(node);return visited.get(node); // 将起始节点的拷贝作为克隆图的引用返回
}解题思路 拷贝所有节点拷贝所有边 解题步骤 深度或广度优先遍历所有节点拷贝所有的节点存储起来将拷贝的节点按照原图的连接方法进行连接 时间复杂度O(n) 访问了图的所有节点 空间复杂度O(n) Map结构存储了所有的节点
2 广度优先遍历
/*** Definition for Node.* class Node {* val: number* neighbors: Node[]* constructor(val?: number, neighbors?: Node[]) {* this.val (valundefined ? 0 : val)* this.neighbors (neighborsundefined ? [] : neighbors)* }* }*/function cloneGraph(node: Node | null): Node | null {if(!node) return;const visited new Map(); // 记录哪些节点被访问以及节点的映射关系// visited.set(node, true); // 标记第一个节点被访问过visited.set(node, new Node(node.val)); // 克隆一个起始节点并和原始节点做关联const q [node];while(q.length) {const n q.shift();// console.log(n.val);(n.neighbors || []).forEach(ne {if(!visited.has(ne)) {q.push(ne);visited.set(ne, new Node(ne.val)); // 拷贝节点}// 拷贝边visited.get(n).neighbors.push(visited.get(ne));})}return visited.get(node);
}时间复杂度 O(n) 遍历所有节点 空间复杂度 O(n) 一个队列