| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【每日一题】力扣133 克隆图 -> 正文阅读 |
|
[数据结构与算法]【每日一题】力扣133 克隆图 |
题目
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值
测试用例格式: 简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。 邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。 给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。 示例 1:
示例 2:
示例 3:
示例 4:
提示:
解题思路题目着重强调是深度克隆,不是表面的值的复制或引用,所以需要手动申请内存空间。 👉递归 因为要复制的是一个图,所以在循环复制的过程一定会出现死循环的情况,这里就要用一个标记数组对每次遍历过的节点进行标记。这个数组不应该是 由于题目每个节点都有一个邻居集,所以递归里一定会有一个循环用来遍历邻居集,下面开始思考具体的代码实现。 首先,递归的结束条件是什么? 正常这种题都是,节点为空的时候。 递归函数的参数和类型是什么? 仔细思考会发现,对于图里的每个节点,其节点的值和创建节点只要一行代码就行,但节点的邻居集是需要遍历的,而且邻居集里又对应了图里的其他节点。所以主要是邻居集不好创建,那我们可以在创建邻居集时,递归到邻居集里的节点,只要该节点创建好了直接返回到邻居集就行了。所以函数的类型就是节点类型,创建节点不需要其他的参数,这里就可以直接使用已给出的函数。 函数里的具体内容是什么? 递归结束的条件放在最开始,这是固定的。当节点为空时,应该返回空节点,这是题目的样例。为了防止陷入死循环,当节点已经访问过了,应该返回的是当前节点。原因: 比如样例一,当访问到第三个节点的邻居集时,会发现邻居集里的节点 解决了返回问题后,就可以创建节点,然后标记节点和访问节点的邻居集了。 👉迭代 迭代做法同样要一个标记数组,但是比递归多了一个队列。这里标记数组换成哈希表,因为哈希表的查找更方便一点。队列里存放需要克隆的图的节点,其实和层次遍历差不多。如下图: 首先把第一个节点放入队列,然后进入 递归和迭代的区别(官方图解): 代码(C++)递归
迭代这里我放官方有注释的。
总结无论是哪种方法都少不了节点的标记,这也算是图的一个特点吧。这种深度复制的方法需要掌握,这可以应用到很多地方,无论是做题还是项目上。 递归函数里的第二个返回值难想到,以及返回的值可以直接放入邻居集里也不好想。 迭代的循环过程也不好想,尤其是使用哈希存储新创建的节点和标记节点的用法不容易想到。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 11:42:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |