中難易度319
無向 接続 グラフ内のノードへの参照を提供します。グラフのディープコピー(クローン)を返してください 。
グラフの各ノードには、その値
val
(int
)とその隣接ノードのリスト()が含まれていますlist[Node]
。class Node { public int val; public List<Node> neighbors; }
テストケースの形式:
簡単にするために、各ノードの値はそのインデックスと同じです。たとえば、最初のノードの値は1(
val = 1
)、2番目のノードの値は2(val = 2
)というようになります。グラフは、テストケースの隣接リストで表されます。隣接リスト は、有限グラフを表すために使用される順序付けられていないリストのコレクションです。各リストは、グラフ内のノードのネイバーのセットを記述します。
指定されたノードは常にグラフの最初のノードになります(値1)。クローンを返すための参照として、与えられたノードのコピーである必要が あります 。
例1:
输入:adjList = [[2,4],[1,3],[2,4],[1,3]] 输出:[[2,4],[1,3],[2,4],[1,3]] 解释: 图中有 4 个节点。 节点 1 的值是 1,它有两个邻居:节点 2 和 4 。 节点 2 的值是 2,它有两个邻居:节点 1 和 3 。 节点 3 的值是 3,它有两个邻居:节点 2 和 4 。 节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
例2:
输入:adjList = [[]] 输出:[[]] 解释:输入包含一个空列表。该图仅仅只有一个值为 1 的节点,它没有任何邻居。
例3:
输入:adjList = [] 输出:[] 解释:这个图是空的,它不含任何节点。
例4:
输入:adjList = [[2],[1]] 输出:[[2],[1]]
促す:
この質問は138に似ています。ランダムなポインタを使用してリンクリストをコピーしますが、脳の速度を落とす必要があります。
- - - - - - - - - - - - - - 更新 - - - - - - - - - - - ---------
最後に、この質問の意味を理解しました。これは、リンクリストの前のコピーと同じです。
以下のコードを説明しましょう:
最初に、訪問したノードキーとその複製されたノード値を格納するグローバルトラバーサルハッシュテーブルを定義します。次に、各ノードにアクセスします。アクセスのプロセスでは、最初にクローンノードを宣言し、現在のノードの値を渡します。次に、現在のノードのネイバーをトラバースし、現在のノードのネイバーをノードのクローンノードに渡します。 。ここでは深さ優先走査法を使用し、ネイバーを訪問しながらネイバーも訪問します。
/*
// 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 == NULL){
return node;
}
if(visited.find(node) != visited.end()){
return visited[node];
}
Node* cloneNode = new Node(node->val);
visited[node] = cloneNode;
for(auto & neighbor: node->neighbors){
cloneNode->neighbors.emplace_back(cloneGraph(neighbor));
}
return cloneNode;
}
};