LeetCode - 133. 克隆图

133. 克隆图

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。

LeetCode - 133. 克隆图_第1张图片

解题思路: 解决问题我们首先要想清楚一点,即我们解决问题的目标是什么,也就是说解决问题的终点,解决到什么程度就认为问题解决完了。解此题也是一样的,怎么样就可以认为克隆图完毕呢,将克隆的节点new完,并且将这个节点的neighbors关联完,这两步做完就可以认为问题解决了。解决此题时,我思路上遇到的一个阻力是如何设计递归函数,即递归函数的形参,以及更重要的,递归函数的返回值,解此题使用的大致框架算法,其实不难想到,本质就是图的遍历(dfs/bfs),那么如何设计参数(形参和返回值),这里就非常有讲究了。之前做过复制(或者说clone的题),一个映射表将两个链表上的节点关联起来,肯定是必不可少的,即hashmap(当然hashmap在此题中还有一个作用,即记忆数组),然后就是在图的遍历过程中,new出克隆的节点,然后如何补全neighbors呢,参考代码中将helper递归函数的返回值设计为克隆节点,问题就简单了。

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector neighbors;
    
    Node() {
        val = 0;
        neighbors = vector();
    }
    
    Node(int _val) {
        val = _val;
        neighbors = vector();
    }
    
    Node(int _val, vector _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

相关题

138. 复制带随机指针的链表

你可能感兴趣的:(leetcode)