• LeetCode——克隆图


    Q:本题要求复制一个无向图,图中每个节点都包含一个标签和它的邻居列表
    我们无向图用以下的方法序列化:

    • 节点的标签是互不相同的,
    • 我们使用“#”作为节点之间的分隔符,使用“,”作为节点标签和节点的节点邻居的分隔符。

    例如:现在有一个序列化的无向图{0,1,2#1,2#2,2}.
    这个无向图一共有3个节点,因此序列被#分隔成三部分

    • 第一个节点的标签是0,节点0和节点1,节点2之间有边
    • 第二个节点的标签是1,节点1和节点2之间有边
    • 第三个节点的标签是2,节点2和节点2(它自己)之间有边,形成了自环

    A:
    设置图结构:

    class UndirectedGraphNode {
        int label;
        ArrayList<UndirectedGraphNode> neighbors;
    
        UndirectedGraphNode(int x) {
            label = x;
            neighbors = new ArrayList<UndirectedGraphNode>();
        }
    };
    

    DFS,递归。

        public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
            HashMap<Integer, UndirectedGraphNode> map = new HashMap<>();
            return clone(map, node);
        }
    
        public static UndirectedGraphNode clone(HashMap<Integer, UndirectedGraphNode> map, UndirectedGraphNode node) {
            if (node == null)
                return null;
            if (map.containsKey(node.label))
                return map.get(node.label);
            UndirectedGraphNode node1 = new UndirectedGraphNode(node.label);
            map.put(node1.label, node1);//放在循环前面,否则由于后面的操作会出现访问不到的情况
            for (UndirectedGraphNode neibor : node.neighbors) {
                node1.neighbors.add(clone(map, neibor));
            }
            return node1;
        }
    

    BFS:使用队列,类似层次遍历

        public UndirectedGraphNode cloneGraph1(UndirectedGraphNode node) {
            if (node == null)
                return node;
            HashMap<UndirectedGraphNode, UndirectedGraphNode> visited = new HashMap<>();
            Queue<UndirectedGraphNode> queue = new LinkedList<>();
            queue.add(node);
            visited.put(node, new UndirectedGraphNode(node.label));
            while (!queue.isEmpty()) {
                UndirectedGraphNode n = queue.remove();
                for (UndirectedGraphNode neighbor : node.neighbors) {
                    if (!visited.containsKey(neighbor)) {
                        visited.put(neighbor, new UndirectedGraphNode(neighbor.label));
                        queue.add(neighbor);
                    }
                    visited.get(n).neighbors.add(visited.get(neighbor));
                }
            }
            return visited.get(node);
        }
    
  • 相关阅读:
    设计模式之抽象工厂模式
    MQ任意延时消息(三)基于服务端实现
    MQ任意延时消息(二)基于客户端实现
    MQ任意延时消息(一)实现原理概述
    sqlyog报错2058
    base标签的作用
    相对路径和绝对路径的解释
    自定义Tomcat部署目录
    常用正则表达式
    接口的结构定义
  • 原文地址:https://www.cnblogs.com/xym4869/p/12469172.html
Copyright © 2020-2023  润新知