leetcode133. 克隆图
给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node])。
示例:
输入:
{"$id":"1","neighbors":[{"$id":"2","neighbors":[{"$ref":"1"},{"$id":"3","neighbors":[{"$ref":"2"},{"$id":"4","neighbors":[{"$ref":"3"},{"$ref":"1"}],"val":4}],"val":3}],"val":2},{"$ref":"4"}],"val":1}
解释:
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
提示:
节点数介于 1 到 100 之间。
无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
必须将给定节点的拷贝作为对克隆图的引用返回。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/clone-graph
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
1bfs:层序遍历
在图的遍历中分为层序遍历和深度遍历,和树的遍历基本相同。使用一个hashmap保存所有遇到的节点,借助一个队列linkedlist来实现层序遍历。
1 /*
2 // Definition for a Node.
3 class Node {
4 public int val;
5 public List<Node> neighbors;
6
7 public Node() {}
8
9 public Node(int _val,List<Node> _neighbors) {
10 val = _val;
11 neighbors = _neighbors;
12 }
13 };
14 */
15 class Solution {
16 public Node cloneGraph(Node node) {
17 if(node==null)
18 return null;
19 HashMap<Node,Node> map=new HashMap<>();
20 LinkedList<Node> list=new LinkedList<>();
21 Node clone=new Node(node.val,new ArrayList<Node>());
22 map.put(node,clone);
23 list.add(node);
24 while(!list.isEmpty())
25 {
26 Node temp=list.remove();
27 for(Node n:temp.neighbors)
28 {
29 if(!map.containsKey(n))
30 {
31 Node next=new Node(n.val,new ArrayList<Node>());
32 map.put(n,next);
33 list.add(n);
34 }
35 map.get(temp).neighbors.add(map.get(n));
36 }
37
38 }
39 return clone;
40 }
41 }
解法2:dfs深度遍历
对于深度遍历来说,依旧需要一个map保存已经创建过的node节点。每一层需要先判断map中是否已经有这个node,有的话就可以直接返回这个node的clone节点,不然需要创建clone节点返回。这道题就变成了递归,那么递归的三要素就需要好好考虑一下, 这里的结束条件应该就是每个节点的neighbors列表遍历完全以后,所以当完成遍历neighbors就返回,返回值是什么呢?因为在遍历的时候还要往复制的node节点里面添加node引用,所以返回值就是复制的node节点,比如说在遍历1的neighbors时遇到2,进入2,那么我们需要返回2的复制节点,这样在1这个节点才会有2的复制,才可以往1的复制节点里面添加2的复制节点。
1 /*
2 // Definition for a Node.
3 class Node {
4 public int val;
5 public List<Node> neighbors;
6
7 public Node() {}
8
9 public Node(int _val,List<Node> _neighbors) {
10 val = _val;
11 neighbors = _neighbors;
12 }
13 };
14 */
15 class Solution {
16 HashMap<Node,Node> map=new HashMap<>();
17 public Node cloneGraph(Node node) {
18 return dfs(node);
19 }
20 public Node dfs(Node node)
21 {
22 if(map.containsKey(node))
23 return map.get(node) ;
24 Node clone=new Node(node.val,new ArrayList<>());
25 map.put(node,clone);
26 for(Node n:node.neighbors)
27 {
28 Node temp=dfs(n);
29 clone.neighbors.add(temp);
30 }
31 return clone;
32 }
33 }
最新文章
- 微信H5页面内实现一键关注公众号
- Html.RenderPartial与Html.RenderAction
- Windows Phone 开发环境的搭建
- 使用C++还是QML
- [转载]Android 异步加载解决方案
- Android无法调用JS的问题解决
- HDU 1213 How Many Tables (并查集)
- php+mysql非缓冲查询(如何循环大数组)
- Chapter 14_3 非全局的环境
- iOS 之 内存管理
- 深圳尚学堂:JavaScript中常见的字符串操作
- Nuget 多平台多目标快速自动打包
- 利用位运算进行a+b的计算(Java&&Python)
- D: Starry的神奇魔法(矩阵快速幂)
- javascript之复习(css属性值的计算)
- PHP实现删除字符串中任何字符的函数
- SPRING框架中ModelAndView、Model、ModelMap区别及详细分析
- js截取字符串的后几位数
- MAVEN 搭建APPFUSE
- Unified shader model