题目描述
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 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,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
输入:adjList = [[]]
输出:[[]]
解释:输入包含一个空列表。该图仅仅只有一个值为 1 的节点,它没有任何邻居。
输入:adjList = []
输出:[]
解释:这个图是空的,它不含任何节点。
输入:adjList = [[2],[1]]
输出:[[2],[1]]
提示:
- 1、节点数不超过
100
。 - 2、每个节点值
Node.val
都是唯一的,1 <= Node.val <= 100
。 - 3、无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
- 4、由于图是无向的,如果节点
p
是节点q
的邻居,那么节点q
也必须是节点p
的邻居。 - 5、图是连通图,你可以从给定节点访问到所有节点。
算法分析
- 1、复制所有的点
用哈希表存储原来的点 -> 复制后的点
,通过dfs
找到所有的点,并把该点进行复制,存入哈希表中 - 2、复制所有的边
枚举整个哈希表,key
表示原来的点,value
表示复制后的点,枚举key
所有的邻接点,并找到邻接点对应的哈希表中映射点(即邻接点的复制点),新开一个链表,把所有的邻接点的复制点都加入该链表中,并把链表赋值到value.neighbors
中
时间复杂度 $O(m)$
m
为边数
Java 代码
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> neighbors;
public Node() {
val = 0;
neighbors = new ArrayList<Node>();
}
public Node(int _val) {
val = _val;
neighbors = new ArrayList<Node>();
}
public Node(int _val, ArrayList<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
*/
class Solution {
static HashMap<Node, Node> map = new HashMap<Node, Node>();
static void dfs(Node node)
{
map.put(node, new Node(node.val));
for(int i = 0;i < node.neighbors.size();i ++)
{
Node t = node.neighbors.get(i);
if(!map.containsKey(t))
dfs(t);
}
}
public Node cloneGraph(Node node) {
if(node == null) return null;
map.clear();
dfs(node);//加入所有的点
for(Map.Entry<Node,Node> entry : map.entrySet()) {
Node a = entry.getKey();
Node b = entry.getValue();
List<Node> res = new ArrayList<Node>();
for(int i = 0;i < a.neighbors.size();i ++)
res.add(map.get(a.neighbors.get(i)));
b.neighbors = res;
}
return map.get(node);
}
}
时间复杂度是n+m
用来java中同时枚举key和value是这样的,学到了,大佬太强了!