zoukankan      html  css  js  c++  java
  • 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 }
    View Code

     解法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 }
    View Code
  • 相关阅读:
    php基本文件操作````
    PHP+JS无限级可伸缩菜单详解(递归方法)
    php 服务器快速搭建
    PHP编码转换函数
    php生成html分页方法-----ob篇
    gcc
    虚拟地址_物理地址_逻辑地址_页表_内存映射
    GCC动态库和静态库混合使用
    Linux下GCC生成和使用静态库和动态库详解(二)
    Linux下GCC生成和使用静态库和动态库详解(一)
  • 原文地址:https://www.cnblogs.com/cold-windy/p/11830430.html
Copyright © 2011-2022 走看看