133. Clone Graph

LeetCode medium original: C# #csharp #graph #hash-table #leetcode #medium #queue
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

Дана ссылка на узел в связанном неориентированном 그래프е.

return глубокую копию (клон) 그래프а.

Каждый узел в 그래프е содержит значение (정수) и список (List[Node]) своих соседей.

예제:

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# 해법

매칭됨/원본
using 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++ 해법

자동 초안, 제출 전 검토
#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 해법

매칭됨/원본
import 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 해법

매칭됨/원본
var 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 해법

매칭됨/원본
from 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 해법

매칭됨/원본
type 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️⃣

Используйте хеш-таблицу для хранения ссылок на копии всех уже посещенных и скопированных узлов. Ключом будет узел оригинального 그래프а, а значением — соответствующий клонированный узел клонированного 그래프а. Хеш-таблица посещенных узлов также используется для предотвращения циклов.

2️⃣

Добавьте первый узел в очередь, клонируйте его и добавьте в хеш-таблицу посещенных.

3️⃣

Выполните обход в ширину (BFS): извлеките узел из начала очереди, посетите всех соседей этого узла. Если какой-либо сосед уже был посещен, получите его клон из хеш-таблицы посещенных; если нет, создайте клон и добавьте его в хеш-таблицу. Добавьте клоны соседей в список соседей клонированного узла.

😎

Vacancies for this task

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.