133. 克隆图
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int)
和其邻居的列表(list[Node]
)。
解题思路: 解决问题我们首先要想清楚一点,即我们解决问题的目标是什么,也就是说解决问题的终点,解决到什么程度就认为问题解决完了。解此题也是一样的,怎么样就可以认为克隆图完毕呢,将克隆的节点new完,并且将这个节点的neighbors关联完,这两步做完就可以认为问题解决了。解决此题时,我思路上遇到的一个阻力是如何设计递归函数,即递归函数的形参,以及更重要的,递归函数的返回值,解此题使用的大致框架算法,其实不难想到,本质就是图的遍历(dfs/bfs),那么如何设计参数(形参和返回值),这里就非常有讲究了。之前做过复制(或者说clone的题),一个映射表将两个链表上的节点关联起来,肯定是必不可少的,即hashmap(当然hashmap在此题中还有一个作用,即记忆数组),然后就是在图的遍历过程中,new出克隆的节点,然后如何补全neighbors呢,参考代码中将helper递归函数的返回值设计为克隆节点,问题就简单了。
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
*/
// DFS, time: O(n),Space: O(n)
class Solution {
public:
Node* helper(Node* node) {
if (!node) return NULL;
if (m.count(node)) return m[node];
Node* newNode = new Node(node->val);
m[node] = newNode;
for (auto a : node->neighbors) {
newNode->neighbors.push_back(helper(a));
}
return newNode;
}
Node* cloneGraph(Node* node) {
if (!node) return NULL;
return helper(node);
}
private:
unordered_map<Node*, Node*> m;
};
参考资料
https://www.cnblogs.com/grandyang/p/4267628.html