zoukankan      html  css  js  c++  java
  • leetcode刷题笔记一百三十三题 克隆图

    leetcode刷题笔记一百三十三题 克隆图

    源地址:133. 克隆图

    问题描述:

    给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

    图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。

    class Node {
    public int val;
    public List neighbors;
    }

    测试用例格式:

    简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。

    邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。

    给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。

    输入:adjList = [[2,4],[1,3],[2,4],[1,3]]
    输出:[[2,4],[1,3],[2,4],[1,3]]
    解释:
    图中有 4 个节点。
    节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
    节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
    节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
    节点 4 的值是 4,它有两个邻居:节点 1 和 3 。

    提示:

    节点数不超过 100 。
    每个节点值 Node.val 都是唯一的,1 <= Node.val <= 100。
    无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
    由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
    图是连通图,你可以从给定节点访问到所有节点。

    //本题有两类思路 DFS或BFS访问图结点,克隆当前结点, 设置克隆节点的neigbhor
    //需要注意的是由于是无向图,需要使用visited列表和HashMap,标记已访问的结点和结点与克隆节点的映射关系,防止出现死循环
    //BFS还需要借助Queue
    import scala.collection.mutable
    object Solution {
        def cloneGraph(graph: Node): Node = {
            if (graph == null) return graph
            val visited = mutable.HashMap[Node, Node]()
            val queue = mutable.Queue[Node]()
    
            queue.enqueue(graph)
            visited.put(graph, new Node(graph.value))
    
            while(queue.isEmpty == false){
                val currentNode = queue.dequeue()
                for (neighbor <- currentNode.neighbors){
                    if (visited.contains(neighbor) == false){
                        queue.enqueue(neighbor)
                        visited.put(neighbor, new Node(neighbor.value))
                    }
                    visited(currentNode).neighbors = visited(currentNode).neighbors.appended(visited(neighbor))
                }
            }
            return visited(graph)
        }
    }
    
    //DFS方法
    /**
     * Definition for a Node.
     * class Node(var _value: Int) {
     *   var value: Int = _value
     *   var neighbors: List[Node] = List()
     * }
     */
    import scala.collection.mutable
    object Solution {
        val visited = mutable.HashMap[Node, Node]()
        def cloneGraph(graph: Node): Node = {
            //val node = graph
            if (graph == null) return graph
            if (visited.contains(graph)) return visited(graph)
            var cloneNode = new Node(graph.value)
            visited.put(graph, cloneNode)
            for (neighbor <- graph.neighbors){
               cloneNode.neighbors =  cloneNode.neighbors.appended(cloneGraph(neighbor))
                //println(cloneNode.neighbors.toString)
            }
            return cloneNode
        }
    }
    
  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13520893.html
Copyright © 2011-2022 走看看