`
frank-liu
  • 浏览: 1684006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Clone Graph

 
阅读更多

问题描述:

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
         / \
         \_/

 

原问题链接:https://leetcode.com/problems/clone-graph/

 

问题分析

  在这个问题里,要对一个图进行克隆。既然要对一个图进行克隆的话,肯定要想法子遍历整个图,并将图里面每个节点都访问到并且克隆到新的图里面才行。所以这个问题里就是要考虑怎么来遍历这个图并且复制每个节点。

  对于图的遍历来说,我们可以采用深度优先遍历或者广度优先遍历。至少看起来随便用哪种都可以。现在主要的问题是在遍历的时候,该怎么复制节点呢? 对于一个图来说,它一个节点可能就对应有多个邻接节点,就算我们碰到这个节点的时候将这个节点的值作为参数新构造一个节点,这还不是完整的克隆。因为它的那些邻接节点都还要设置。可是在刚开始都没遍历到那些节点呢,没法一开始就把所有的节点都设上。

  这里我们可以采用一个map,保存有原来图中访问过的节点以及对应的新图中要克隆的节点。这样我们对于节点就构成了一个一一对应的关系。在图遍历的过程中可能会碰到前面访问过的节点,这样可以通过这个map来判断了。

  假设我们采用广度优先遍历的方式来处理。在碰到一个节点之后,将它所有邻接节点都依次取出来,如果在map里已经找到了对应的元素,就将这个元素加到它对应节点的邻接节点列表里。否则就新建一个节点,并将这个新节点加入到对应节点的邻接节点列表里。当然,这个新节点也要加入到map和队列中。按照这样一个顺序一直遍历结束。

  详细的代码实现如下:

 

/**
 * 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;
        Queue<UndirectedGraphNode> queue = new LinkedList<>();
        Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();
        queue.add(node);
        UndirectedGraphNode copy = new UndirectedGraphNode(node.label);
        map.put(node, copy);
        while(!queue.isEmpty()) {
            UndirectedGraphNode temp = queue.remove();
            copy = map.get(temp);
            for(UndirectedGraphNode item : temp.neighbors) {
                if(map.containsKey(item)) {
                    copy.neighbors.add(map.get(item));
                } else {
                    UndirectedGraphNode newNode = new UndirectedGraphNode(item.label);
                    map.put(item, newNode);
                    copy.neighbors.add(newNode);
                    queue.add(item);
                }
            }
        }
        return map.get(node);
    }
}

 

分享到:
评论

相关推荐

    CloneGraph

    leetcode CloneGraph java 源代码

    leetcode分类-leetcode:leetcode

    leetcode 分类 Leetcode 介绍 leetcode个人题解,根据leetcode给的标签进行分类,按照数据结构对题目...graph:图论 greedy:贪心算法 recursion:递归算法 sort:排序算法 heap: 堆的应用题解 安装教程 clone IDEA JDK 8

    133.Clone Graph 克隆图【LeetCode单题讲解系列】

    133.Clone_Graph_克隆图【LeetCode单题讲解系列】

    python-leetcode题解之133-Clone-Graph

    python python_leetcode题解之133_Clone_Graph

    js-leetcode题解之133-clone-graph.js

    javascript js_leetcode题解之133-clone-graph.js

    leetcode分类-leetcode-solution:leetcode-解决方案

    用java解决包含但不限于array/tree/graph等几种数据结构、分治/DP/backtrack等几种算法思想的题目,并取得平均题解runtime beats 80%的成绩。 每天打卡(估计很快失败)平均每天1题保本,2题赚翻。 项目构建: 根...

    Leetcode book刷题必备

    38. Clone Graph:深度复制一个图。 【栈】 39. Min Stack:设计一个栈,支持 push、pop、top 操作,并且在常数时间内得到栈的最小值。 40. Evaluate Reverse Polish Notation:计算后缀表达式。 41. Valid ...

    Leetcode答案(c++版)

    **1.19 Clone Graph (133)** - **问题描述**:给定一个无向图,对其进行深拷贝。 - **解题思路**: - 使用深度优先搜索(DFS)或广度优先搜索(BFS)遍历整个图。 - 对于每个访问过的节点,创建一个副本,并将...

    leetcode同类骰子-Algorithms:LeetCode,GeeksforGeeks

    Clone Graph, medium --- 类似于#138 207,课程表,中等 210 课程表 II,中等 261,图有效树,中等 310,最小高度树,中等 323,无向图中连通分量的数量,中等 444,序列重建,中 第二周——堆 215,数组中的第 K 个...

    algorithms:只是个菜鸟。这个项目是在空闲时间编写的。我会不定期更新。希望与您分享一些东西〜

    与大家分享我学习算法的一些经历。这个项目不定期更新。数组/链表:树相关:AVLTree 平衡二叉搜索树...BFSGraph 图BFS模板Dijkstra 寻求最短路SwimmingCrossSea 漂洋过海CloneGraph (leetcode 133)字符串相关:Reve

    leetcode java

    杂项部分包括了一些不那么容易归类的问题,如螺旋矩阵(Spiral Matrix)、整数转罗马数字(Integer to Roman)、克隆图(Clone Graph)等。 **栈(Stack)** 栈是一种先进后出(FILO)的数据结构。 - 最小栈(Min ...

    股票买卖最佳时机leetcode-Java-Projects:Java项目和面试问题的存储库,用于编码面试的练习

    Clone_Graph 组合_总和 Counting_Carry_Digits 平等的 First_Missing_Positive Generate_All_Parenthesis_2 实现_StrStr Largest_Distance_Between_Nodes_Of_A_Tree Largest_Rectangle_In_Histogram Least_C

    LeetCode

    例如,"Clone Graph"题目中,通过DFS克隆一个无向图;"Shortest Path in Binary Matrix"则需要BFS寻找矩阵中最短路径。 总结,通过LeetCode的实践,我们可以提升JavaScript编程技巧,熟练掌握各种数据结构和算法,...

    常见算法题答案及解析

    38. Clone Graph:复制一个无向图。 39. Min Stack:设计一个栈,支持获取栈内最小元素的操作。 40. Evaluate Reverse Polish Notation:计算后缀表达式的值。 41. Valid Parentheses:判断字符串是否为有效的括号...

    Leetcode注意

    图形**** ****BFS class Solution { public Node cloneGraph ( Node node ) { if (node == null ) { return null ; } Map&lt; Node&gt; map = new HashMap&lt;&gt; (); Queue&lt; Node&gt; queue = new LinkedList&lt;&gt; (); queue ....

    克隆图(python map+dfs)1

    `cloneGraph`函数的目的是接收一个`Node`对象并返回一个新的、完全独立的`Node`对象,所有节点及其连接关系都要被正确地复制。 解决方案是使用深度优先搜索策略。首先,创建一个空的`map_list`字典,用于存储原图中...

    CPP-JAVA-DSA:使用C ++和Java解决了来自不同编码网站的面试CC问题

    存储库会定期更新,因此请确保提取代码git pull组织这些问题按其来源的主要主题划分问题陈述在代码顶部被注释掉LeetCode问题被命名为leetcode_(问题编号)_(问题标题),并且仅提供Solution类其他问题仅通过标题...

Global site tag (gtag.js) - Google Analytics