Skip to content

Latest commit

 

History

History
executable file
·
126 lines (113 loc) · 3.72 KB

133. Clone Graph.md

File metadata and controls

executable file
·
126 lines (113 loc) · 3.72 KB

133. Clone Graph

Question

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.

OJ's undirected graph serialization:

Nodes are labeled uniquely. We use # as a separator for each node, and , as a separator for node label and each neighbor of the node.

As an example, consider the serialized graph {0,1,2#1,2#2,2}.

The graph has a total of three nodes, and therefore contains three parts as separated by #.

First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
Second node is labeled as 1. Connect node 1 to node 2.
Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.

Visually, the graph looks like the following:

   1
  / \
 /   \
0 --- 2
     / \
     \_/

Thinking:

  • Method 1:DFS
/**
 * Definition for undirected graph.
 * class UndirectedGraphNode {
 *     int label;
 *     List<UndirectedGraphNode> neighbors;
 *     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
 * };
 */
public class Solution {
    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
        Map<Integer, UndirectedGraphNode> map = new HashMap<>();
        return node == null ? null : dfs(node, map);
    }
    private UndirectedGraphNode dfs(UndirectedGraphNode node, Map<Integer, UndirectedGraphNode> map){
        if(map.containsKey(node.label)) return map.get(node.label);
        UndirectedGraphNode temp = new UndirectedGraphNode(node.label);
        map.put(node.label, temp);
        for(UndirectedGraphNode n : node.neighbors){
            temp.neighbors.add(dfs(n, map));
        }
        return temp;
    }
}

二刷

  1. 参考了一刷,使用DFS。
/**
 * Definition for undirected graph.
 * class UndirectedGraphNode {
 *     int label;
 *     List<UndirectedGraphNode> neighbors;
 *     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
 * };
 */
public class Solution {
    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
        if(node == null) return null;
        Map<Integer, UndirectedGraphNode> map = new HashMap<>();
        return dfs(node, map);
    }
    private UndirectedGraphNode dfs(UndirectedGraphNode node, Map<Integer, UndirectedGraphNode> map){
        if(map.containsKey(node.label)) return map.get(node.label);
        UndirectedGraphNode res = new UndirectedGraphNode(node.label);
        map.put(node.label, res);
        for(UndirectedGraphNode n : node.neighbors){
            res.neighbors.add(dfs(n, map));
        }
        return res;
    }
}

Third Time

  • Method 1: dfs + map
    • Step 1: Check is current node is empty.
    • Step 2: Check if cached.
    • Step 3: Create a new node and save it into map.
    • Step 4: Use dfs to copy all its neighbours.
    /*
    // Definition for a Node.
    class Node {
        public int val;
        public List<Node> neighbors;
        public Node() {}
        public Node(int _val,List<Node> _neighbors) {
            val = _val;
            neighbors = _neighbors;
        }
    };
    */
    class Solution {
        private Map<Integer, Node> map;
        public Node cloneGraph(Node node) {
            map = new HashMap<>();
            return dfs(node, node.val);
        }
        private Node dfs(Node node, int num){
            if(node == null) return null;
            else if(map.containsKey(num)) return map.get(num);
            else{
                List<Node> neighbours = new ArrayList<>();
                Node cur = new Node(num, neighbours);
                map.put(num, cur);
                for(Node neighbour : node.neighbors){
                    neighbours.add(dfs(neighbour, neighbour.val));
                }
                return cur;
            }
        }
    }