Тема ссылка: https://leetcode-cn.com/problems/clone-graph/
Тема Описание:
Учитывая неориентированный связи ссылочный узла, вернуть фигуру глубокой копию (клон). Каждый узел в графе содержит его значение val
( Int
), а также список своих соседей ( list[Node]
).
Пример:
输入:
{"$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 。
Советы:
- Узлы в диапазоне от 1 до 100.
- Неориентированный граф является простым графом, что означает, что нет дубликатов на стороны фиг, поскольку нет петли.
- В графе неориентированный, если узел р д соседний узел, узел узла р д также должен быть соседями.
- Скопировано узла должна быть предоставлена в качестве ссылки на возвращает клонов фиг.
Идеи:
Этот вопрос должны пройти всю карту, поэтому время, чтобы пройти через точку доступа было зарегистрировано, мы используем словарную запись
Итак, есть два способа обхода
Мысль: ДФС (глубина обход)
Думая два: BFS (широта обход)
Код:
Мысль:
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)
Джава
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;
}
}
Думая два:
"""
# 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)
Джава
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;
}
}
Источник: остаться кнопка (LeetCode)
ссылка: https://leetcode-cn.com/problems/clone-graph
авторского права вычета из всех сетей. Коммерческая перепечатка пожалуйста , свяжитесь с уполномоченной должностным лицом, некоммерческая перепечатка пожалуйста , укажите источник.