Topic links: https://leetcode-cn.com/problems/clone-graph/
Subject description:
Given an undirected communication reference drawing of a node, return the figure deep copy (clone). Each node in the graph contains its value val
( Int
), and a list of its neighbors ( list[Node]
).
Example:
输入:
{"$id":"1","neighbors":[{"$id":"2","neighbors":[{"$ref":"1"},{"$id":"3","neighbors":[{"$ref":"2"},{"$id":"4","neighbors":[{"$ref":"3"},{"$ref":"1"}],"val":4}],"val":3}],"val":2},{"$ref":"4"}],"val":1}
解释:
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
prompt:
- Nodes between 1 and 100.
- Undirected graph is a simple graph, which means that there are no duplicate FIG side, since there is no loop.
- As the graph is undirected, if the node is p q neighbor node, the node node p q must also be neighbors.
- Copied node must be given as a reference to returns clones FIG.
Ideas:
This question is to traverse the entire map, so the time to traverse the access point has been recorded, we use a dictionary record
So, there are two traversal methods
A thought: DFS (depth traversal)
Thinking two: BFS (breadth traversal)
Code:
A thought:
class Solution:
def cloneGraph(self, node: 'Node') -> 'Node':
lookup = {}
def dfs(node):
#print(node.val)
if not node: return
if node in lookup:
return lookup[node]
clone = Node(node.val, [])
lookup[node] = clone
for n in node.neighbors:
clone.neighbors.append(dfs(n))
return clone
return dfs(node)
java
class Solution {
public Node cloneGraph(Node node) {
Map<Node, Node> lookup = new HashMap<>();
return dfs(node, lookup);
}
private Node dfs(Node node, Map<Node,Node> lookup) {
if (node == null) return null;
if (lookup.containsKey(node)) return lookup.get(node);
Node clone = new Node(node.val, new ArrayList<>());
lookup.put(node, clone);
for (Node n : node.neighbors)clone.neighbors.add(dfs(n,lookup));
return clone;
}
}
Thinking two:
"""
# Definition for a Node.
class Node:
def __init__(self, val, neighbors):
self.val = val
self.neighbors = neighbors
"""
class Solution:
def cloneGraph(self, node: 'Node') -> 'Node':
from collections import deque
lookup = {}
def bfs(node):
if not node: return
clone = Node(node.val, [])
lookup[node] = clone
queue = deque()
queue.appendleft(node)
while queue:
tmp = queue.pop()
for n in tmp.neighbors:
if n not in lookup:
lookup[n] = Node(n.val, [])
queue.appendleft(n)
lookup[tmp].neighbors.append(lookup[n])
return clone
return bfs(node)
java
class Solution {
public Node cloneGraph(Node node) {
if (node == null) return null;
Map<Node, Node> lookup = new HashMap<>();
Node clone = new Node(node.val, new ArrayList<>());
lookup.put(node, clone);
Deque<Node> queue = new LinkedList<>();
queue.offer(node);
while (!queue.isEmpty()) {
Node tmp = queue.poll();
for (Node n : tmp.neighbors) {
if (!lookup.containsKey(n)) {
lookup.put(n, new Node(n.val, new ArrayList<>()));
queue.offer(n);
}
lookup.get(tmp).neighbors.add(lookup.get(n));
}
}
return clone;
}
}
Source: stay button (LeetCode)
link: https://leetcode-cn.com/problems/clone-graph
copyrighted by deduction from all networks. Commercial reprint please contact the authorized official, non-commercial reprint please indicate the source.