zoukankan      html  css  js  c++  java
  • LeetCode 133 克隆图

    Leetcode 133 克隆图

    给定一个无向图,要求给出该无向图的深克隆图(所谓深克隆是指克隆图中的每个节点都要是区别于旧图对应节点的新节点)
    方法: 需要对给定的无向图进行遍历(DFS/BFS),遍历过程中对每个节点进行克隆并建立图(节点间串联)
    BFS

    class Solution {
        public Node cloneGraph(Node node) {
            if (node == null) return null;
            //保存原图(old)已遍历节点、到克隆图(new)的节点映射
            Map<Node, Node> oldToNew = new HashMap<>();
            Node clone = new Node(node.val, new ArrayList<>());
            oldToNew.put(node, clone);
            Deque<Node> queue = new LinkedList<>();
            queue.offer(node);
            while (!queue.isEmpty()) {
                Node tmp = queue.poll();
                //遍历并复制原图tmp节点及其next节点
                for (Node n : tmp.neighbors) {
                    //避免重复遍历原图节点
                    if (!oldToNew.containsKey(n)) {
                        //添加原图未遍历节点、克隆图复制节点
                        oldToNew.put(n, new Node(n.val, new ArrayList<>()));
                        queue.offer(n);
                    }
                    //添加next node(克隆图节点串联)
                    oldToNew.get(tmp).neighbors.add(lookup.get(n));
                }
            }
            return clone;
        }
    }
    

    DFS

    class Solution {
        private HashMap <Node, Node> visited = new HashMap <> ();
        public Node cloneGraph(Node node) {
            if (node == null) {
                return node;
            }
    
            // 如果该节点已经被访问过了,则直接从哈希表中取出对应的克隆节点返回
            if (visited.containsKey(node)) {
                return visited.get(node);
            }
    
            // 克隆节点,注意到为了深拷贝我们不会克隆它的邻居的列表
            Node cloneNode = new Node(node.val, new ArrayList());
            // 哈希表存储
            visited.put(node, cloneNode);
    
            // 遍历该节点的邻居并更新克隆节点的邻居列表
            for (Node neighbor: node.neighbors) {
                cloneNode.neighbors.add(cloneGraph(neighbor));
            }
            return cloneNode;
        }
    }
    
  • 相关阅读:
    聊聊关于性能优化和其他(一)
    JavaScript 事件循环及异步原理(完全指北)
    SPA路由机制详解(看不懂不要钱~~)
    Web安全系列(三):XSS 攻击进阶(挖掘漏洞)
    Web安全系列(二):XSS 攻击进阶(初探 XSS Payload)
    浅谈Generator和Promise原理及实现
    Kubernetes 服务目录
    Kubernetes 网络模型
    个人开源贡献记录
    【转载】DTO – 服务实现中的核心数据
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13488805.html
Copyright © 2011-2022 走看看