133. Clone Graph 發表於 2023-02-13 | 分類於 leetcode problemsolutionoption 1 - dfs12345678910111213141516171819202122232425262728293031323334353637/*// 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*> visited; Node* cloneGraph(Node* node) { if(!node ) return node; // 避免陷入無限循環 if(visited.find(node)!=visited.end()) return visited[node]; Node *clone = new Node(node->val); visited[node] = clone; for(Node* n:node->neighbors){ clone->neighbors.push_back(cloneGraph(n)); } return visited[node]; }}; option 2 - bfs1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/*// 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 {private: unordered_map<Node*, Node*> copies;public: Node* cloneGraph(Node* node) { if (!node) { return NULL; } Node* copy = new Node(node -> val, {}); copies[node] = copy; queue<Node *>q; q.push(node); while(!q.empty()){ Node *cur = q.front(); q.pop(); for(Node *neighbor:cur->neighbors){ if(copies.find(neighbor)==copies.end()){ copies[neighbor] = new Node(neighbor->val, {}); q.push(neighbor); } copies[cur] -> neighbors.push_back(copies[neighbor]); } } return copy; }}; analysis time complexity O(n+m), n is the number of nodes and m is the number of edges sparse complexity O(n)