LeetCode--133--medium--CloneGraph

summary:

graph | dfs |by using a map with visited nodes  , we can resolve cyclical recursion

package myapp.kit.leetcode.graph;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * 133
 * medium
 * https://leetcode.com/problems/clone-graph/
 *
 * Given a reference of a node in a connected undirected graph.
 *
 * Return a deep copy (clone) of the graph.
 *
 * Each node in the graph contains a val (int) and a list (List[Node]) of its neighbors.
 *
 * class Node {
 *     public int val;
 *     public List<Node> neighbors;
 * }
 *
 *
 * Test case format:
 *
 * For simplicity sake, each node's value is the same as the node's index (1-indexed). For example, the first node with val = 1, the second node with val = 2, and so on. The graph is represented in the test case using an adjacency list.
 *
 * Adjacency list is a collection of unordered lists used to represent a finite graph. Each list describes the set of neighbors of a node in the graph.
 *
 * The given node will always be the first node with val = 1. You must return the copy of the given node as a reference to the cloned graph.
 *
 *
 *
 * Example 1:
 *
 *
 * Input: adjList = [[2,4],[1,3],[2,4],[1,3]]
 * Output: [[2,4],[1,3],[2,4],[1,3]]
 * Explanation: There are 4 nodes in the graph.
 * 1st node (val = 1)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
 * 2nd node (val = 2)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
 * 3rd node (val = 3)'s neighbors are 2nd node (val = 2) and 4th node (val = 4).
 * 4th node (val = 4)'s neighbors are 1st node (val = 1) and 3rd node (val = 3).
 * Example 2:
 *
 *
 * Input: adjList = [[]]
 * Output: [[]]
 * Explanation: Note that the input contains one empty list. The graph consists of only one node with val = 1 and it does not have any neighbors.
 * Example 3:
 *
 * Input: adjList = []
 * Output: []
 * Explanation: This an empty graph, it does not have any nodes.
 * Example 4:
 *
 *
 * Input: adjList = [[2],[1]]
 * Output: [[2],[1]]
 *
 *
 * Constraints:
 *
 * 1 <= Node.val <= 100
 * Node.val is unique for each node.
 * Number of Nodes will not exceed 100.
 * There is no repeated edges and no self-loops in the graph.
 * The Graph is connected and all nodes can be visited starting from the given node.
 *
 *
 * Created with IDEA
 * author:Dingsheng Huang
 * Date:2020/4/14
 * Time:上午11:01
 *
 */
public class CloneGraph {

    private Map<Integer, Node> visitedMap = new HashMap<>();

    public Node cloneGraph(Node node) {
        return clone(node);
    }

    // by using a map with visited nodes , we can resolve cyclical recursion
    private Node clone(Node node) {
        if (node == null) {
            return null;
        }
        // visited
        if (visitedMap.containsKey(node.val)) {
            return visitedMap.get(node.val);
        }
        // clone
        Node newNode = new Node(node.val, new ArrayList<>());
        visitedMap.put(newNode.val, newNode);
        for (Node sub : node.neighbors) {
            Node newSub = clone(sub);
            newNode.neighbors.add(newSub);
        }
        return newNode;
    }
}
发布了205 篇原创文章 · 获赞 27 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/huangdingsheng/article/details/105508683
今日推荐