題目網址:https://leetcode.cn/problems/clone-graph/
題意:給一無向連通圖的 node, 請返回該圖的 copy。
圖中每個 node 都包含它的 val
(int) 和其 neighbors
(list[node])




Solution 1:
想法:利用 DFS
class Solution { public: Node* cloneGraph(Node* node) { if (!node) { return node; } return dfs(node); }
private: unordered_map<Node*, Node*> visited;
Node* dfs(Node* node){ if (visited.find(node) != visited.end()) { return visited[node]; }
Node* copy = new Node(node->val); visited[node] = copy;
for (const auto& neighbor : node->neighbors) { copy->neighbors.emplace_back(dfs(neighbor)); } return copy; } };
|
- time:$O(V+E)$ ➔ 必須拜訪所有 node, 和其延伸出去的所有 edge
- space:$O(V)$ ➔
oldToNew
Solution 2:
想法:利用 BFS
class Solution { public: Node* cloneGraph(Node* node) { if (!node) { return node; }
unordered_map<Node*, Node*> visited; queue<Node*> q; q.push(node); visited[node] = new Node(node->val);
while (!q.empty()) { Node* n = q.front(); q.pop();
for (const auto& neighbor : n->neighbors) { if (visited.find(neighbor) == visited.end()) { visited[neighbor] = new Node(neighbor->val); q.push(neighbor); } visited[n]->neighbors.emplace_back(visited[neighbor]); } } return visited[node]; } };
|
- time:$O(V+E)$ ➔ 必須拜訪所有 node, 和其延伸出去的所有 edge
- space:$O(V)$ ➔
visited