[Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]

【问题描述】[中等]

在这里插入图片描述
在这里插入图片描述

【解答思路】

其实就是深拷贝的一个实现,深拷贝就是对于所有的指针成员,不能仅仅是赋值,还有重新分配空间。

深拷贝反应在本题中就是,所有的结点需要重新new出来,而不是直接赋值。
整体的思路依然是dfs,跑遍原图中每个结点,然后根据原结点生成新结点。
要注意的地方就是,因为图存在环,所以要标记访问过的结点,避免重复形成死循环:
如果该结点已经被访问过,则不再遍历该结点,而是直接将指针值赋给自己邻接点数组----浅拷贝;
如果该结点没有被访问过,则继续dfs遍历该结点,并将产生的新结点----深拷贝;

1. DFS

在这里插入图片描述
在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(N)
在这里插入图片描述

class Solution {
// 哈希表对应关系,节点1 --> 节点1的克隆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;}
}
2. BFS

在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(N)
在这里插入图片描述

class Solution {public Node cloneGraph(Node node) {if (node == null) {return node;}HashMap<Node, Node> visited = new HashMap();// 将题目给定的节点添加到队列LinkedList<Node> queue = new LinkedList<Node> ();queue.add(node);// 克隆第一个节点并存储到哈希表中visited.put(node, new Node(node.val, new ArrayList()));// 广度优先搜索while (!queue.isEmpty()) {// 取出队列的头节点Node n = queue.remove();// 遍历该节点的邻居for (Node neighbor: n.neighbors) {if (!visited.containsKey(neighbor)) {// 如果没有被访问过,就克隆并存储在哈希表中visited.put(neighbor, new Node(neighbor.val, new ArrayList()));// 将邻居节点加入队列中queue.add(neighbor);}// 更新当前节点的邻居列表//  record.get(n)表示通过原节点得到它的克隆节点// 继续.neighbors.add(record.get(neighbor))表示往它的克隆节点中加入邻接节点// 为什么是add(record.get(neighbor))而不是add(neighbor)// 因为n是原图的节点,record.get(neighbor)才是我们在上面if里克隆出的新节点visited.get(n).neighbors.add(visited.get(neighbor));}}return visited.get(node);}
}

【总结】

1. 课本上总说deep copy和shallow copy,似懂非懂的,不觉得这东西有什么用。慢慢地,发现deep copy背后隐藏的逻辑其实是一种对象图(Object Graph)的遍历行为——这东西广泛出现在各语言的垃圾回收、序列化机制里。内存里各个对象存储空间中放置的引用域/指针就好像有向图里一条边,你沿着它去到达内存中的每个角落、去到当前对象所有的关联对象。题设里的neibours就像一道开胃菜,它可以是其他collection、甚至object,学会这个deep copy,你也就学会了GC里的可达性分析、你也就学会了如何把RAM中的数据固化到硬盘里。
2.读题困难 对HashMap的读取操作不熟悉导致理解困难

转载链接:https://leetcode-cn.com/problems/clone-graph/solution/ke-long-tu-by-leetcode-solution/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阅读目录(置顶)(长期科技领域知识)

第一期:适用于数据项目的7种强大的开源工具 第二期:四种正确的微服务部署方式 第三期:开源和赚钱何去何从 第四期:Web前端和Java开发哪个薪资更高&#xff0c;发展前景更好&#xff1f; 第五期:干货总结&#xff1a;中级前端工程师必须要掌握的27个JavaScript 技巧 第六期…

[Leetcode][第733题][JAVA][图像渲染][BFS][DFS]

【问题描述】[简单] 【解答思路】 千万不要想复杂了 不是三维空间 是一维空间 &#xff01; 本题要求将给定的二维数组中指定的「色块」染成另一种颜色。「色块」的定义是&#xff1a;直接或间接相邻的同色方格构成的整体。 可以发现&#xff0c;「色块」就是被不同颜色的方…

第七章 假设检验

假设检验的目的是通过收集到的数据&#xff0c;来验证某个想要得到的结论。 假设检验的思想是&#xff1a;小概率反证法思想。 显著性检验是本章的主要内容。下面从实际例子来通俗的理解一下显著性检验。 显著性检验中有几个概念不太好理解。 嫌犯X是否有罪 有这样一个事件…

第七章 假设检验(2)

接上文。 正态总体均值、方差的假设检验 单个正态总体均值的假设检验、方差的假设检验&#xff1b;成对数据均值的假设检验、两个正态总体方差比的检验。根据检验统计量的分布分别称为:z检验、t检验、卡方检验、F检验。 分布原假设H0检验统计量备择假设H1拒绝域单正态(σ2已知…

第二十二期:动画讲解TCP,再不懂请来打我

TCP 三次握手过程对于面试是必考的一个&#xff0c;所以不但要掌握 TCP 整个握手的过程&#xff0c;其中有些小细节也更受到面试官的青睐。 前言 TCP 三次握手过程对于面试是必考的一个&#xff0c;所以不但要掌握 TCP 整个握手的过程&#xff0c;其中有些小细节也更受到面试官…

第二十三期:你用的Windows操作系统是不是盗版?微软知道吗

长期以来&#xff0c;一些小白对于微软操作系统的“正版”“盗版”“原版”的含义不太明确&#xff0c;从根本上说Windows原始版权属于微软&#xff0c;我们没有那个技术去开发盗版操作系统&#xff0c;很多人用的可能是二次修改的版本&#xff0c;而操作系统的激活方式&#x…

[Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

【问题描述】[中等] 【解答思路】 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {return buildTree(head, null);}public TreeNode buildTree(ListNode left, ListNode right) {if (left right) {return null;}ListNode mid …

第四十六期:关于云存储的五大优势

5G时代&#xff0c;越来越多的企业开始选择在云上存储数据&#xff0c;对于IT部门来说&#xff0c;了解云存储的优势是很有必要的。今天给大家介绍云存储的五大优势&#xff0c;以及它们如何帮助用户解决一些常见IT问题。 1、可扩展性 传统存储系统以及横向扩展增加的节点&…

第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?

Java架构师&#xff0c;首先要是一个高级java攻城狮&#xff0c;熟练使用各种框架&#xff0c;并知道它们实现的原理。jvm虚拟机原理、调优&#xff0c;懂得jvm能让你写出性能更好的代码;池技术&#xff0c;什么对象池&#xff0c;连接池&#xff0c;线程池…… Java架构师&…

【数据结构与算法】散列表

一、散列表的由来&#xff1f; 1.散列表来源于数组&#xff0c;它借助散列函数对数组这种数据结构进行扩展&#xff0c;利用的是数组支持按照下标随机访问元素的特性。 2.需要存储在散列表中的数据我们称为键&#xff0c;将键转化为数组下标的方法称为散列函数&#xff0c;散列…

第八章方差分析以及线性回归(1)

方差分析 方差分析是由英国统计学家Fisher在20世纪20年代提出的。  方差分析的目的是推断两个或者两个以上的总体均值是否有差异的显著性检验。 单因素方差分析 例子 保险公司为了了解某一险种在4个不同地区索赔额情况是否存在差异。收集了四个地区一年的索赔额记录。这四个…

第四十八期:只因写了一段爬虫,公司200多人被抓!

刚从朋友听到这个消息的时候&#xff0c;我有点不太相信&#xff0c;做为一名程序员来讲&#xff0c;谁还没有写过几段爬虫呢&#xff1f;只因写爬虫程序就被端有点夸张了吧。 作者&#xff1a;纯洁的微笑|2019-10-17 09:51 “一个程序员写了个爬虫程序&#xff0c;整个公司20…

[Leetcode][第647题][JAVA][回文子串][动态规划][中心扩展][Manacher 算法]

【问题描述】[中等] 【解答思路】 1. 暴力 首先明确如何判断一个字符串是否为回文字符串。第一个字符与最后一个字符相同&#xff0c;第二个字符与倒数第二个字符相同…关于中心位置轴对称。 本题要求一共有多少个回文子串&#xff0c;那么就需要判断&#xff0c;索引[i, j]的…

玩转oracle 11g(52):Oracle导出导入表(.sql、.dmp文件)两种方法

提示&#xff1a;在导入sql和dmp文件之前&#xff0c;先建立用户&#xff0c;指明表空间。其中要注意用户名和表空间最好跟sql文件中的一样。 方法一&#xff1a;.sql文件的导出与导入 导出步骤 使用PL/SQL Developer登录你需要备份的数据库&#xff1b;选择工具->导出用…

第八章方差分析以及线性回归(2)

一元线性回归 变量间的关系 变量与变量之间的关系分为确定性关系和相关性关系。  确定性关系是指当自变量给定一个值的时候&#xff0c;就能计算出应变量的值。例如物体下落高度h与下落时间t的关系&#xff1a;h12gt2。  相关性关系是指变量之间的关系不确定&#xff0c;表…

Creating a Pulsing Circle Animation

Creating a Pulsing Circle Animation 原文 https://www.kirupa.com/animations/creating_pulsing_circle_animation.htm Outside of transitions that animate between states, we dont see a whole lot of actual animation in the many UIs we interact with. We dont have …

第四十九期:化繁为简的五种码农必备工具

如今&#xff0c;开发工具已成为了软件开发过程中必不可少的组成部分。本文将向您介绍当前软件开发市场上颇具影响力的五种化繁为简的码农必备工具。 不知您是否已经发现&#xff1a;那些以任务为中心的软件开发工作&#xff0c;会比独立的研究式开发复杂得多。针对软件产品的开…

第五十期:工作强度超996,失业半年即出局,硅谷为何如此“嗜血”?

在硅谷&#xff0c;靠创业发财的人被称为中了“硅谷六合彩”&#xff0c;大多数个体的艰难挣扎&#xff0c;最终换来了硅谷长久的繁荣昌盛。 划重点 1、在硅谷&#xff0c;靠创业发财的人被称为中了“硅谷六合彩”。 2、谷歌的合同工必须比正式工早两小时到公司打卡&#xff…

【数据结构与算法】二叉树

树 1.树、二叉树 2.二叉查找树 3.平衡二叉树、红黑树 4.递归树 一、树 1.树的常用概念 根节点、叶子节点、父节点、子节点、兄弟节点&#xff0c;还有节点的高度、深度以及层数&#xff0c;树的高度。 2.概念解释 节点&#xff1a;树中的每个元素称为节点 父子关系&#xff…

第二十四期:面试问:Kafka为什么速度那么快?该怎么回答

针对Kafka的基准测试可以参考&#xff0c;Apache Kafka基准测试&#xff1a;每秒写入2百万(在三台廉价机器上)下面从数据写入和读取两方面分析&#xff0c;为什么Kafka速度这么快 Kafka的消息是保存或缓存在磁盘上的&#xff0c;一般认为在磁盘上读写数据是会降低性能的&#x…