133. 克隆图

复制代码
https://leetcode.cn/problems/clone-graph/description/?envType=study-plan-v2&envId=top-interview-150思路:题目要求我们使用深拷贝,我们首先要知道深拷贝是什么。深拷贝就是再拷贝对象时开辟一块新的空间存放对象,两个对象不共享内存。这题就是让我们遍历所有节点再new新的出来。遍历的方式有很多我这里选择的是bfs。
java 复制代码
class Solution {
    static class Node {
        public int val;
        public List<Node> neighbors;
        public Node() {
            val = 0;
            neighbors = new ArrayList<Node>();
        }
        public Node(int _val) {
            val = _val;
            neighbors = new ArrayList<Node>();
        }
        public Node(int _val, ArrayList<Node> _neighbors) {
            val = _val;
            neighbors = _neighbors;
        }
    }

    public Node cloneGraph(Node node) {
        if(node == null) return null;
        if(node.neighbors.isEmpty()) return new Node(1);
        // 创建一个队列用来存放节点
        Queue<Node> nodes = new LinkedList<>();
        nodes.add(node);
        Node newNode = new Node(node.val);
        // 创建一个list用来存放节点是否被访问过, 我们也可以通过val值来找到对应的node节点
        HashMap<Integer, Node> visited = new HashMap<>();
        visited.put(node.val, newNode);
        // 创建一个待复制的等待队列
        Queue<Node> queue = new LinkedList<>();
        queue.add(newNode);
        while(!nodes.isEmpty()) {
            Node cur = nodes.remove();
            Node curNew = queue.remove();
            for(Node neighbor : cur.neighbors) {
                if(!visited.containsKey(neighbor.val)) { // 保证每个节点只复制一次
                    Node newNeighbor = new Node(neighbor.val);
                    curNew.neighbors.add(newNeighbor);
                    nodes.add(neighbor);
                    queue.add(newNeighbor);
                    visited.put(neighbor.val, newNeighbor);
                } else {// 节点复制过了,我们去visited中找到对应的节点
                    curNew.neighbors.add(visited.get(neighbor.val));
                }
            }

        }

        check(node, newNode);
        return newNode;
    }

    /**
     * 检查两个图是否相同
     * @param node
     * @param newNode
     */
    private static void check(Node node, Node newNode) {
        ArrayList<Node> l1 = new ArrayList<>();
        ArrayList<Node> l2 = new ArrayList<>();
        HashSet<Node> set1 = new HashSet<>();
        HashSet<Node> set2 = new HashSet<>();
        l1.add(node);
        l2.add(newNode);
        set1.add(node);
        set2.add(newNode);
        while(!l1.isEmpty() && !l2.isEmpty()) {
            Node cur1 = l1.remove(0);
            Node cur2 = l2.remove(0);
            if(cur1.val == cur2.val && cur1 != cur2) {
                System.out.println("ture");
            }
            for(int i = 0; i < cur1.neighbors.size(); i++) {
                Node neighbor1 = cur1.neighbors.get(i);
                Node neighbor2 = cur2.neighbors.get(i);
                if(!set1.contains(neighbor1)) {
                    l1.add(neighbor1);
                    set1.add(neighbor1);
                }
                if (!set2.contains(neighbor2)) {
                    l2.add(neighbor2);
                    set2.add(neighbor2);
                }
            }

        }
    }

    public static void main(String[] args) {
        ArrayList<Node> list = new ArrayList<>();
        list.add(new Node(1));
        list.add(new Node(2));
        list.add(new Node(3));
        list.add(new Node(4));
        list.get(0).neighbors.add(list.get(1));
        list.get(0).neighbors.add(list.get(3));
        list.get(1).neighbors.add(list.get(0));
        list.get(1).neighbors.add(list.get(2));
        list.get(2).neighbors.add(list.get(1));
        list.get(2).neighbors.add(list.get(3));
        list.get(3).neighbors.add(list.get(0));
        list.get(3).neighbors.add(list.get(2));
        new Solution().cloneGraph(list.get(0));
    }
}
相关推荐
hn小菜鸡15 分钟前
LeetCode 2570.合并两个二维数组-求和法
数据结构·算法·leetcode
hn小菜鸡15 分钟前
LeetCode 524.通过删除字母匹配到字典里最长单词
算法·leetcode·职场和发展
Greedy Alg16 分钟前
LeetCode 226. 翻转二叉树
算法
我要成为c嘎嘎大王17 分钟前
【C++】模版专题
c++·算法
jndingxin20 分钟前
算法面试(5)------NMS(非极大值抑制)原理 Soft-NMS、DIoU-NMS 是什么?
人工智能·算法·目标跟踪
南部余额21 分钟前
Maven 依赖管理与版本优化
java·maven
create1729 分钟前
IntelliJ IDEA 等软件如何与 AI 编程工具(Cursor、Windsurf、Qoder等)实现互相跳转
java·ide·人工智能·intellij-idea
望获linux30 分钟前
论文解读:利用中断隔离技术的 Linux 亚微秒响应性能优化
java·linux·运维·前端·arm开发·数据库·性能优化
龙茶清欢1 小时前
7、微服务中 DTO、VO、PO、BO 的设计规范
java·spring boot·spring cloud
ToneChip1 小时前
配合AI自动生成时序图--最详细在VS Code中使用PlantUML绘图
java