(68) 133. 克隆图(leetcode)

题目链接:
https://leetcode-cn.com/problems/clone-graph/
难度:中等
133. 克隆图
	给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
	图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
	class Node {
	    public int val;
	    public List<Node> neighbors;
	}

题目不难 才做过类似的 方法一模一样。。。
递归

/*
// 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;
    }
};
*/

class Solution {
    
    
public:
    unordered_map<Node*,Node*> flag;
    //  一
    Node* cloneGraph(Node* node) {
    
    
        if(node==nullptr){
    
    
            return node;
        }
        if(flag.find(node)!=flag.end()){
    
    
            return flag[node];
        }
        Node* ans=new Node(node->val);
        flag[node]=ans;
        for(auto &nei:node->neighbors){
    
    
            ans->neighbors.emplace_back(cloneGraph(nei));
        }
        return ans;
    }
};
//  二
// 当然也可以将所有的node:newnode全部存在flag中
// 然后枚举建立关系
    void dfs(Node* node){
    
    
        flag[node]=new Node(node->val);
        for(auto nei:node->neighbors){
    
    
            if(flag.find(nei)==flag.end()){
    
    
                dfs(nei);
            }
        }
    }
    Node* cloneGraph(Node* node) {
    
    
        if(node==nullptr){
    
    
            return node;
        }
        dfs(node);
        for(auto [s , d] : flag){
    
    
            for(auto nei:s->neighbors){
    
    
                d->neighbors.push_back(flag[nei]);
            }
        }
        return flag[node];
    }

这个是使用queue 不使用递归 (写的时候出错了 看了下题解 哎 还是不太熟练。。。 这个月这种类型的题估计不少 慢慢练吧 我还是太菜了)

class Solution {
    
    
public:
    Node* cloneGraph(Node* node) {
    
    
        if(node==nullptr){
    
    
            return node;
        }
        
        unordered_map<Node*,Node*> flag;
        queue<Node*> que;

        flag[node]=new Node(node->val);
        que.emplace(node);

        while(!que.empty()){
    
    
            Node *cur=que.front();
            que.pop();
            for(auto &nei:cur->neighbors){
    
    
                Node *newnode;
                if(flag.find(nei)!=flag.end()){
    
    
                    newnode=flag[nei];
                }else{
    
    
                    newnode=new Node(nei->val);
                    flag[nei]=newnode;
                    que.emplace(nei);
                }
                flag[cur]->neighbors.emplace_back(newnode);
            }
        }
        return flag[node];
    }
};

猜你喜欢

转载自blog.csdn.net/li_qw_er/article/details/107947303