133. Clone Graph
Дана ссылка на узел в связанном неориентированном grapheе.
return глубокую копию (клон) grapheа.
Каждый узел в grapheе содержит значение (entier) и список (List[Node]) своих соседей.
Exemple:
Input: adjList = [[2,4],[1,3],[2,4],[1,3]]
Output: [[2,4],[1,3],[2,4],[1,3]]
Explanation: There are 4 nodes in the graph.
1st node (val = 1)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
2nd node (val = 2)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
3rd node (val = 3)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
4th node (val = 4)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
C# solution
correspondant/originalusing System.Collections.Generic;
public class Node {
public int val;
public IList<Node> neighbors;
public Node() {
val = 0;
neighbors = new List<Node>();
}
public Node(int _val) {
val = _val;
neighbors = new List<Node>();
}
public Node(int _val, List<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
public class Solution {
public Node CloneGraph(Node node) {
if (node == null) {
return node;
}
Dictionary<Node, Node> visited = new Dictionary<Node, Node>();
Queue<Node> queue = new Queue<Node>();
queue.Enqueue(node);
visited[node] = new Node(node.val, new List<Node>());
while (queue.Count > 0) {
Node n = queue.Dequeue();
foreach (Node neighbor in n.neighbors) {
if (!visited.ContainsKey(neighbor)) {
visited[neighbor] = new Node(neighbor.val, new List<Node>());
queue.Enqueue(neighbor);
}
visited[n].neighbors.Add(visited[neighbor]);
}
}
return visited[node];
}
}
C++ solution
brouillon automatique, à relire avant soumission#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
public class Node {
public int val;
public IList<Node> neighbors;
public Node() {
val = 0;
neighbors = new List<Node>();
}
public Node(int _val) {
val = _val;
neighbors = new List<Node>();
}
public Node(int _val, List<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
class Solution {
public:
public Node CloneGraph(Node node) {
if (node == null) {
return node;
}
unordered_map<Node, Node> visited = new unordered_map<Node, Node>();
queue<Node> queue = new queue<Node>();
queue.Enqueue(node);
visited[node] = new Node(node.val, new List<Node>());
while (queue.size() > 0) {
Node n = queue.Dequeue();
foreach (Node neighbor in n.neighbors) {
if (!visited.count(neighbor)) {
visited[neighbor] = new Node(neighbor.val, new List<Node>());
queue.Enqueue(neighbor);
}
visited[n].neighbors.push_back(visited[neighbor]);
}
}
return visited[node];
}
}
Java solution
correspondant/originalimport java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.ArrayList;
class Node {
public int val;
public List<Node> neighbors;
public Node() {}
public Node(int _val, List<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
class Solution {
public Node cloneGraph(Node node) {
if (node == null) {
return node;
}
HashMap<Node, Node> visited = new HashMap();
LinkedList<Node> queue = new LinkedList<Node>();
queue.add(node);
visited.put(node, new Node(node.val, new ArrayList()));
while (!queue.isEmpty()) {
Node n = queue.remove();
for (Node neighbor : n.neighbors) {
if (!visited.containsKey(neighbor)) {
visited.put(neighbor, new Node(neighbor.val, new ArrayList()));
queue.add(neighbor);
}
visited.get(n).neighbors.add(visited.get(neighbor));
}
}
return visited.get(node);
}
}
JavaScript solution
correspondant/originalvar cloneGraph = function (node) {
if (node === null) return node;
const visited = new Map();
const queue = [node];
visited.set(node, { val: node.val, neighbors: [] });
while (queue.length > 0) {
const n = queue.shift();
n.neighbors.forEach((neighbor) => {
if (!visited.has(neighbor)) {
visited.set(neighbor, { val: neighbor.val, neighbors: [] });
queue.push(neighbor);
}
visited.get(n).neighbors.push(visited.get(neighbor));
});
}
return visited.get(node);
};
Python solution
correspondant/originalfrom collections import deque
class Node:
def __init__(self, val=0, neighbors=None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
class Solution:
def cloneGraph(self, node: Optional["Node"]) -> Optional["Node"]:
if not node:
return node
visited = {}
queue = deque([node])
visited[node] = Node(node.val, [])
while queue:
n = queue.popleft()
for neighbor in n.neighbors:
if neighbor not in visited:
visited[neighbor] = Node(neighbor.val, [])
queue.append(neighbor)
visited[n].neighbors.append(visited[neighbor])
return visited[node]
Go solution
correspondant/originaltype Node struct {
Val int
Neighbors []*Node
}
func cloneGraph(node *Node) *Node {
if node == nil {
return node
}
visited := make(map[*Node]*Node)
queue := []*Node{node}
visited[node] = &Node{node.Val, []*Node{}}
for len(queue) > 0 {
n := queue[0]
queue = queue[1:]
for _, neighbor := range n.Neighbors {
if _, ok := visited[neighbor]; !ok {
visited[neighbor] = &Node{neighbor.Val, []*Node{}}
queue = append(queue, neighbor)
}
visited[n].Neighbors = append(
visited[n].Neighbors,
visited[neighbor],
)
}
}
return visited[node]
}
Algorithm
1️⃣
Используйте хеш-таблицу для хранения ссылок на копии всех уже посещенных и скопированных узлов. Ключом будет узел оригинального grapheа, а значением — соответствующий клонированный узел клонированного grapheа. Хеш-таблица посещенных узлов также используется для предотвращения циклов.
2️⃣
Добавьте первый узел в очередь, клонируйте его и добавьте в хеш-таблицу посещенных.
3️⃣
Выполните обход в ширину (BFS): извлеките узел из начала очереди, посетите всех соседей этого узла. Если какой-либо сосед уже был посещен, получите его клон из хеш-таблицы посещенных; если нет, создайте клон и добавьте его в хеш-таблицу. Добавьте клоны соседей в список соседей клонированного узла.
😎
Vacancies for this task
offres actives with overlapping task tags are affichés.