133 Clone Graph
阿新 • • 發佈:2017-07-23
== node conn solution ray blog arr efi win
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 / \_/
克隆問題常常用hashMap, 關鍵在於如何從一個點設置遍歷, 此處用list, 不斷遍歷, 不斷list. get(start++) ,再通過neighbour來獲取新的node.
/** * 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) { // write your code here if (node == null) { return node; } HashMap<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode> (); ArrayList<UndirectedGraphNode> nodes = new ArrayList<UndirectedGraphNode>(); //copy nodes nodes.add(node); map.put(node, new UndirectedGraphNode(node.label)); int start = 0; while (start < nodes.size()) { UndirectedGraphNode head = nodes.get(start++); for (UndirectedGraphNode n : head.neighbors) { if (!map.containsKey(n)) { map.put(n, new UndirectedGraphNode(n.label)); // 對nodes進行了add因此不能用foreach nodes.add(n); } } } //copy neighbors for (UndirectedGraphNode i : nodes) { UndirectedGraphNode newNode = map.get(i); for (UndirectedGraphNode j : i.neighbors) { newNode.neighbors.add(map.get(j)); } } return map.get(node); } }
133 Clone Graph