
方法1: dfs。这是一道graph题,我第一感觉是要用recursion来做的。我离正确答案离的很近,最近好久没做题,有点生疏,如果是之前手感,做出来应该没问题。我没做出来主要是我使用了set而不是map,在怎样避免操作重复node上面我理解的不对。还是那句话,多联系吧,这题不难,应该拿下的。复杂度复盘看。
/*
// 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 {
private Map<Node, Node> visited = new HashMap<>();
public Node cloneGraph(Node node) {
if(node == null){
return node;
}
if(visited.containsKey(node)){
return visited.get(node);
}
Node root = new Node(node.val, new ArrayList<>());
visited.put(node, root);
for(Node n : node.neighbors){
root.neighbors.add(cloneGraph(n));
}
return root;
}
}
方法2: bfs,方法1的变种,用bfs来实现的,也不是很难理解。
/*
// 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 {
public Node cloneGraph(Node node) {
if(node == null)
return node;
Map<Node, Node> visited = new HashMap<>();
Queue<Node> queue = new LinkedList<>();
queue.offer(node);
visited.put(node, new Node(node.val, new ArrayList<>()));
while(!queue.isEmpty()){
Node curr = queue.poll();
for(Node n : curr.neighbors){
if(!visited.containsKey(n)){
visited.put(n, new Node(n.val, new ArrayList<>()));
queue.offer(n);
}
visited.get(curr).neighbors.add(visited.get(n));
}
}
return visited.get(node);
}
}
总结:
- 无
这篇博客探讨了如何使用DFS和BFS解决图的克隆问题。作者通过两种不同的方法详细解释了算法的实现过程,强调了在处理重复节点时的注意事项,并建议通过不断练习来提高解题能力。复杂度分析也包含在内,对于理解图的遍历策略提供了清晰的指导。
691

被折叠的 条评论
为什么被折叠?



