[LeetCode][Java] Clone Graph

来源:互联网 发布:五道口金融博士知乎 编辑:程序博客网 时间:2024/06/08 03:22

题目:

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 #.

  1. First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
  2. Second node is labeled as 1. Connect node 1 to node 2.
  3. 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         / \         \_/

题意:

克隆无向图。图中的每一个节点包含一个label 和 一组neighbors.

本题中的无向图的定义为:

每个节点都是唯一标记的。

我们通过#来划分每一个节点 通过,来划分节点标记和节点的每一个邻居。

举个例子,给定一个图{0,1,2#1,2#2,2}.

这个图中共3个节点,因此包含了通过#划分的三个部分.

   1.第一个节点被标记为 0.连接节点0和节点1 and 2.

   2.第二个节点被标记为 1.将节点1和 节点2相连接.

  3.第三个节点被标记为 2. 将节点2和节点2(它自身)想连接,这样就形成了自环.

这个图就如下面所示:

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

算法分析:


 * 共两种方法,DFS--递归, BFS--队列
  
 * 拷贝方法是用用HashMap,key存原始值,value存copy的值,用DFS或者BFS方法遍历帮助拷贝neighbors的值。
   
 * 但这里有个问题,在clone一个节点时我们需要clone它的neighbors,而邻居节点有的已经存在,有的未存在,如何进行区分?


 * 这里我们使用Map来进行区分,Map的key值为原来的node,value为新clone的node,当发现一个node未在map中时说明这个node还未被clone,


AC代码:

/** * Definition for undirected graph. * class UndirectedGraphNode  * { *     int label; *     List<UndirectedGraphNode> neighbors; *     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); } * }; */


方法一:广度优先搜索BFS 利用队列

public class Solution {    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node)    {        if(node == null)            return null;                    HashMap<UndirectedGraphNode, UndirectedGraphNode> hm = new HashMap<UndirectedGraphNode, UndirectedGraphNode>();        LinkedList<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>();        UndirectedGraphNode head = new UndirectedGraphNode(node.label);        hm.put(node, head);//key存原始值,value存copy的值        queue.add(node);                while(!queue.isEmpty())        {            UndirectedGraphNode curnode = queue.poll();            for(UndirectedGraphNode aneighbor: curnode.neighbors)//check each neighbor            {                if(!hm.containsKey(aneighbor))//if not visited,then add to queue                {                    queue.add(aneighbor);                    UndirectedGraphNode newneighbor = new UndirectedGraphNode(aneighbor.label);                    hm.put(aneighbor, newneighbor);                }                hm.get(curnode).neighbors.add(hm.get(aneighbor));//head.neighbors.add(newneightbor)            }        }        return head;    }}

方法二:通过递归进行DFS深度优先遍历

public class Solution {    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node)     {            if(node == null)                return null;                            HashMap<UndirectedGraphNode, UndirectedGraphNode> hm = new HashMap<UndirectedGraphNode, UndirectedGraphNode>();            UndirectedGraphNode head = new UndirectedGraphNode(node.label);//初始化话节点时没有邻接节点            hm.put(node, head);//key存原始值,value存copy的值                        DFS(hm, node);//DFS            return head;    }    public void DFS(HashMap<UndirectedGraphNode, UndirectedGraphNode> hm, UndirectedGraphNode node)    {        if(node == null)            return;                    for(UndirectedGraphNode aneighbor: node.neighbors)        {             if(!hm.containsKey(aneighbor))            {                UndirectedGraphNode newneighbor = new UndirectedGraphNode(aneighbor.label);                hm.put(aneighbor, newneighbor);                DFS(hm, aneighbor);//DFS            }            hm.get(node).neighbors.add(hm.get(aneighbor));//对该节点拷贝neighbors的值。        }    }}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子不专心学习怎么办 一年级孩子学习边学边忘怎么办 对爱不专心怎么办 孩子脑子不灵活怎么办 小孩写作业心慌怎么办 4岁写数字怎么办 孩子做事太慢怎么办 小孩子做事不认真怎么办 员工做事不认真怎么办 做事总是不认真怎么办 孩子上课老是讲话怎么办 孩子上课总讲话怎么办 孩子不求上进怎么办 孩子只知道吃完怎么办 孩子演出前紧张怎么办 儿童写字不专心怎么办 孩子上课没精神怎么办 小孩写字太慢怎么办 儿童上课不集中怎么办 突然头晕迷糊眼花怎么办 自己上课不专心怎么办 颈椎病头晕怎么办才好 孩孑记忆力不好怎么办 上课的时候困怎么办 小学生写字太慢怎么办 一年级小学生写字慢怎么办 小学生写字太用力怎么办 专注力不集中怎么办 一年级孩子写字慢怎么办 孩子话很多应该怎么办 孩子废话特别多怎么办 老师不认真教学怎么办 小孩脸上长痦子怎么办 小朋友爱讲笑话怎么办 小孩上课不认真怎么办 小孩子精神不集中怎么办 孩子上课都不听怎么办 把孩子脸打肿了怎么办 学佛 家人爱吃肉怎么办 孩子上课老说话怎么办? 毕业答辩被怼怎么办