边工作边刷题:70天一遍leetcode: day 11-1
Clone Graph
dfs或者bfs都可以做,这题的要点是hashmap有两个作用:一是图遍历中的visited,另一个是存copy的结点来连接neighbors。hashmap即表示visited,同时存某个结点的copy(这里有copy了就是已经visited)。
- bfs和dfs本身特性的区别
- bfs: 进q和展开是分开的。因为是按层处理,只有下层全进q,才开始从头出q同时展开下一层
- dfs: 这里递归下一层相当于进q,展开相当于出q,也就是说进q和展开是同时的。
- 根据上面1,dfs/bfs对visited的定义不同(or加入hashmap和判断visited的时机)
- bfs:如果当前结点的neighbors没有创建结点,要创建并加入hashmap中。这样才能保证连接。同时要加入q中。而visited就表示已经进q了。而出q的结点不做visited判断
- dfs:同样是"进q"的时候,visited判断和加入hashmap同时发生在一层。展开的neighbors要进入下一层
# Definition for a undirected graph node
# class UndirectedGraphNode(object):
# def __init__(self, x):
# self.label = x
# self.neighbors = []
class Solution(object):
def cloneGraph(self, node):
"""
:type node: UndirectedGraphNode
:rtype: UndirectedGraphNode
"""
def clone(node, umap):
if node not in umap:
umap[node]=UndirectedGraphNode(node.label)
for n in node.neighbors:
umap[node].neighbors.append(clone(n, umap))
return umap[node]
umap = {}
if not node: return None
return clone(node, umap)