[leetcode]133. Clone Graph@Java解题报告
2017-08-15 10:40
411 查看
https://leetcode.com/problems/clone-graph/description/
Clone an undirected graph. Each node in the graph contains a
a list of its
OJ's undirected graph serialization:
Nodes are labeled uniquely.
We use
a separator for node label and each neighbor of the node.
As an example, consider the serialized graph
The graph has a total of three nodes, and therefore contains three parts as separated by
First node is labeled as
both nodes
Second node is labeled as
node
Third node is labeled as
node
Visually, the graph looks like the following:
package go.jacob.day815;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
/**
* 133. Clone Graph
* @author Jacob
* 牛客的测试不够严谨,直接返回node也是可以通过的
*
* 以下分享DFS循环和递归实现
*/
public class Demo1 {
/*
* 循环实现
*/
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if (node == null)
return null;
// map存储旧节点到新节点的映射
Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>();
UndirectedGraphNode head = new UndirectedGraphNode(node.label);
map.put(node, head);
// DFS需要用到栈
Stack<UndirectedGraphNode> stack = new Stack<UndirectedGraphNode>();
stack.push(node);
while (!stack.isEmpty()) {
UndirectedGraphNode root = stack.pop();
ArrayList<UndirectedGraphNode> lists = new ArrayList<UndirectedGraphNode>();
for (UndirectedGraphNode n : root.neighbors) {
if (map.containsKey(n)) {
lists.add(map.get(n));
} else {
UndirectedGraphNode n1 = new UndirectedGraphNode(n.label);
stack.push(n);
map.put(n, n1);
lists.add(n1);
}
}
System.out.println(map.containsKey(root));
map.get(root).neighbors = lists;
}
return head;
}
/*
* 递归实现
*/
private HashMap<Integer, UndirectedGraphNode> map = new HashMap<>();
public UndirectedGraphNode cloneGraph_1(UndirectedGraphNode node) {
return clone(node);
}
private UndirectedGraphNode clone(UndirectedGraphNode node) {
if (node == null) return null;
if (map.containsKey(node.label)) {
return map.get(node.label);
}
UndirectedGraphNode clone = new UndirectedGraphNode(node.label);
map.put(clone.label, clone);
for (UndirectedGraphNode neighbor : node.neighbors) {
clone.neighbors.add(clone(neighbor));
}
return clone;
}
}
Clone an undirected graph. Each node in the graph contains a
labeland
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
0to
both nodes
1and
2.
Second node is labeled as
1. Connect node
1to
node
2.
Third node is labeled as
2. Connect node
2to
node
2(itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1 / \ / \ 0 --- 2 / \ \_/
package go.jacob.day815;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
/**
* 133. Clone Graph
* @author Jacob
* 牛客的测试不够严谨,直接返回node也是可以通过的
*
* 以下分享DFS循环和递归实现
*/
public class Demo1 {
/*
* 循环实现
*/
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
if (node == null)
return null;
// map存储旧节点到新节点的映射
Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<UndirectedGraphNode, UndirectedGraphNode>();
UndirectedGraphNode head = new UndirectedGraphNode(node.label);
map.put(node, head);
// DFS需要用到栈
Stack<UndirectedGraphNode> stack = new Stack<UndirectedGraphNode>();
stack.push(node);
while (!stack.isEmpty()) {
UndirectedGraphNode root = stack.pop();
ArrayList<UndirectedGraphNode> lists = new ArrayList<UndirectedGraphNode>();
for (UndirectedGraphNode n : root.neighbors) {
if (map.containsKey(n)) {
lists.add(map.get(n));
} else {
UndirectedGraphNode n1 = new UndirectedGraphNode(n.label);
stack.push(n);
map.put(n, n1);
lists.add(n1);
}
}
System.out.println(map.containsKey(root));
map.get(root).neighbors = lists;
}
return head;
}
/*
* 递归实现
*/
private HashMap<Integer, UndirectedGraphNode> map = new HashMap<>();
public UndirectedGraphNode cloneGraph_1(UndirectedGraphNode node) {
return clone(node);
}
private UndirectedGraphNode clone(UndirectedGraphNode node) {
if (node == null) return null;
if (map.containsKey(node.label)) {
return map.get(node.label);
}
UndirectedGraphNode clone = new UndirectedGraphNode(node.label);
map.put(clone.label, clone);
for (UndirectedGraphNode neighbor : node.neighbors) {
clone.neighbors.add(clone(neighbor));
}
return clone;
}
}
相关文章推荐
- 【LeetCode】Linked List Cycle 解题报告(Java & Python)
- [leetcode]141. Linked List Cycle@Java解题报告
- [leetcode]46. Permutations@Java解题报告
- [leetcode]47. Permutations II@Java解题报告
- [leetcode]98. Validate Binary Search Tree@Java解题报告
- [leetcode]100. Same Tree@Java解题报告
- [leetcode]60. Permutation Sequence@Java解题报告
- 【LeetCode】Hamming Distance 解题报告(java & python)
- Leetcode 349. Intersection of Two Arrays 解题报告 Python Java
- Add Binary | leetcode 67 【Java解题报告】
- Climbing Stairs | leetcode 70 【Java解题报告】
- [leetcode]142. Linked List Cycle II@Java解题报告
- [leetcode]76. Minimum Window Substring@Java解题报告
- 【LeetCode】Single Number 解题报告(Java & Python)
- [leetcode]136. Single Number@Java解题报告
- Move Zeroes | leetcode 283 【Java解题报告】
- Ugly Number | leetcode 263 【Java解题报告】
- [leetcode]144. Binary Tree Preorder Traversal@Java解题报告
- 【LeetCode】Two Sum 解题报告(java & python)
- [leetcode]99. Recover Binary Search Tree@Java解题报告