[LeetCode] C ++:中間問題-図133.クローン図

133.クローンマップ

中難易度319

無向 接続 グラフ内のノードへの参照を提供しますグラフのディープコピー(クローン)を返してください 

グラフの各ノードには、その値valint)とその隣接ノードのリストが含まれています 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]]

 

促す:

  1. ノードの数は100を超えません。
  2. 各ノード値 Node.val は一意1 <= Node.val <= 100です。
  3. 無向グラフは単純なグラフです。つまり、グラフにエッジや自己ループが繰り返されることはありません。
  4. グラフは無向であるため、ノード p がノードqの 隣接ノードで ある場合、ノードq もノードpの 隣接ノードで ある必要があります 
  5. グラフは接続されたグラフであり、特定のノードからすべてのノードにアクセスできます。

この質問は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;
    }
};

 

おすすめ

転載: blog.csdn.net/weixin_44566432/article/details/113530802
おすすめ