数据结构与算法之图: Leetcode 133. 克隆图 (Typescript版)
克隆图
- https://leetcode.cn/problems/clone-graph/description/
描述
-
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
-
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
class Node {public int val;public List<Node> neighbors; } -
测试用例格式:
- 简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。
- 邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。
- 给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。
示例 1
输入:adjList = [[2,4],[1,3],[2,4],[1,3]]
输出:[[2,4],[1,3],[2,4],[1,3]]
解释:
图中有 4 个节点。
节点 1 的值是 1,它有两个邻居:节点 2 和 4 。
节点 2 的值是 2,它有两个邻居:节点 1 和 3 。
节点 3 的值是 3,它有两个邻居:节点 2 和 4 。
节点 4 的值是 4,它有两个邻居:节点 1 和 3 。
示例 2
输入:adjList = [[]]
输出:[[]]
解释:输入包含一个空列表。该图仅仅只有一个值为 1 的节点,它没有任何邻居。
示例 3
输入:adjList = []
输出:[]
解释:这个图是空的,它不含任何节点。
示例 4
输入:adjList = [[2],[1]]
输出:[[2],[1]]
提示
- 节点数不超过 100 。
- 每个节点值 Node.val 都是唯一的,1 <= Node.val <= 100。
- 无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
- 由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
- 图是连通图,你可以从给定节点访问到所有节点。
算法实现
1 )深度优先遍历
/*** Definition for Node.* class Node {* val: number* neighbors: Node[]* constructor(val?: number, neighbors?: Node[]) {* this.val = (val===undefined ? 0 : val)* this.neighbors = (neighbors===undefined ? [] : neighbors)* }* }*/// 深度优先遍历方法
function cloneGraph(node: Node | null): Node | null {if(!node) return;const visited = new Map(); // 记录哪些节点被访问,以及节点的映射关系const dfs = (n: Node | null) => {// console.log(n.val);let nCopy = new Node(n.val); // 克隆了一个节点visited.set(n, nCopy); // 将每个拷贝的节点和之前的节点做一个映射的关系// 空数组的forEach不会执行(n.neighbors || []).forEach(ne => {if(!visited.has(ne)) {dfs(ne);}nCopy.neighbors.push(visited.get(ne));});};dfs(node);return visited.get(node); // 将起始节点的拷贝作为克隆图的引用返回
}
-
解题思路
- 拷贝所有节点
- 拷贝所有边
-
解题步骤
- 深度或广度优先遍历所有节点
- 拷贝所有的节点,存储起来
- 将拷贝的节点,按照原图的连接方法进行连接
-
时间复杂度:O(n)
- 访问了图的所有节点
-
空间复杂度:O(n)
- Map结构存储了所有的节点
2 )广度优先遍历
/*** Definition for Node.* class Node {* val: number* neighbors: Node[]* constructor(val?: number, neighbors?: Node[]) {* this.val = (val===undefined ? 0 : val)* this.neighbors = (neighbors===undefined ? [] : neighbors)* }* }*/function cloneGraph(node: Node | null): Node | null {if(!node) return;const visited = new Map(); // 记录哪些节点被访问,以及节点的映射关系// visited.set(node, true); // 标记第一个节点被访问过visited.set(node, new Node(node.val)); // 克隆一个起始节点并和原始节点做关联const q = [node];while(q.length) {const n = q.shift();// console.log(n.val);(n.neighbors || []).forEach(ne => {if(!visited.has(ne)) {q.push(ne);visited.set(ne, new Node(ne.val)); // 拷贝节点}// 拷贝边visited.get(n).neighbors.push(visited.get(ne));})}return visited.get(node);
}
- 时间复杂度 O(n)
- 遍历所有节点
- 空间复杂度 O(n)
- 一个队列
相关文章:
数据结构与算法之图: Leetcode 133. 克隆图 (Typescript版)
克隆图 https://leetcode.cn/problems/clone-graph/description/ 描述 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[No…...
illuminate/database 使用 一
illuminate/database 是完整的php数据库工具包,即ORM(Object-Relational Mapping)类库。 提供丰富的查询构造器,和多个驱动的服务。作为Laravel的数据库层使用,也可以单独使用。 一 使用 加载composer之后ÿ…...
前端koa搭建服务器(保姆级教程)——part1
目录 koa简介前端项目搭建koa环境第一步:新建项目第二步:环境初始化,安装依赖初始化项目,生成package.json文件安装koa依赖安装koa-router 路由管理依赖安装dotenv 环境变量依赖安装nodemon 热启动依赖 第三步:代码调用…...
js逆向第一课 密码学介绍
什么是密码学? 密码学(Cryptology)是一种用来混淆的技术,它希望将正常的、可识别的信息转变为无法识别的信息。 目前密码学的研究,一种是偏应用,把现有的,别人研究出来的密码学算法,放在一个合…...
Dynamic DataSource 多数据源配置【 Springboot + DataSource + MyBatis Plus + Druid】
一、前言 MybatisPlus多数据源配置主要解决的是多数据库连接和切换的问题。在一些大型应用中,由于数据量的增长或者业务模块的增多,可能需要访问多个数据库。这时,就需要配置多个数据源。 二、Springboot MyBatis Plus 数据源配置 2.1、单数…...
MyBatis:配置文件
MyBatis 前言全局配置文件映射配置文件注 前言 在 MyBatis 中,配置文件分为 全局配置文件(核心配置文件) 和 映射配置文件 。通过这两个配置文件,MyBatis 可以根据需要动态地生成 SQL 语句并执行,同时将结果集转换成 …...
ARM,基础、寄存器
1.认识ARM 1)是一家公司 2)做RISC处理器内核 3)不生产芯片 2.ARM处理器的最新发展(重要) 高端产品线: cortex-A9 主要做音视频开发,例如:手机 平板..... 中端产品线:cortex-R 主要做实时性要求比较高的系统 例如&#…...
FC-TSGAS-1624 CP451-10 MVI56E-MNETC IC697CMM742
FC-TSGAS-1624 CP451-10 MVI56E-MNETC IC697CMM742. Variscite的DART-MX8M-PLUS和VAR-SOM-MX8M-PLUS基于恩智浦i.MX 8M Plus SoC,集成人工智能能力高达每秒2.3万亿次运算(TOPS)。这些产品,结合海螺-8 AI处理器提供多达26个top,显著优于市场…...
异或运算.
相同为0,不同为1。 1 ^ 10 0 ^ 00 1 ^ 01 0 ^ 11性质: 0 ^ N N N ^ N 0交换、结合 a ^ b b ^ a; (a ^ b) ^ c a ^ (b ^ c); 因此异或全部的元素的结果就是那个只出现1次的元素。 实现两个值的交换,而不必使…...
NewStarCTF2023week4-逃(反序列化字符串逃逸)
打开链接,大致审一下php代码,是反序列化相关的; 结合题目提示,很典型的字符串逃逸; 并且属于替换修改后导致序列化字符串变长的类型; 看似加了一个waf函数对我们提交的内容进行了过滤替换,实…...
PyTorch Tensor 形状
查看张量形状 有两种方法查看张量形状: 通过属性查看 Tensor.shape通过方法查看 Tensor.size() 两种方式的结果都是一个 torch.Size 类型(元组的子类)的对象 >>> t torch.empty(3, 4) >>> t.size() torch.Size([3, 4]) # 获取 dim1 维度的 size >>…...
RabbitMQ运行机制和通讯过程介绍
文章目录 1.RabbitMQ 环境搭建2.RabbitMQ简介3.RabbitMQ的优势:4. rabbitmq服务介绍4.1 rabbitmq关键词说明4.2 消息队列运行机制4.3 exchange类型 5.wireshark抓包查看RabbitMQ通讯过程 1.RabbitMQ 环境搭建 参考我的另一篇:RabbitMQ安装及使用教程&am…...
UE4 TextRender显示中文方法
UE4 TextRender显示中文 1.内容浏览器右键,用户界面->字体。新建一个。 2.添加字体,右边栏,细节。字体缓存类型:离线。 3.高度参数就是字体大小,导入选项勾选”仅透明度”,字符里输入字库的字符。 4.资产,重新导…...
C++动态规划算法的应用:得到 K 个半回文串的最少修改次数 原理源码测试用例
本文涉及的基础知识点 动态规划 题目 得到 K 个半回文串的最少修改次数 给你一个字符串 s 和一个整数 k ,请你将 s 分成 k 个 子字符串 ,使得每个 子字符串 变成 半回文串 需要修改的字符数目最少。 请你返回一个整数,表示需要修改的 最少…...
Pyside6 QFileDialog
Pyside6 QFileDialog Pyside6 QFileDialog常用函数getOpenFileNamegetOpenFileNamesgetExistingDirectorygetSaveFileName 程序界面程序主程序 Pyside6 QFileDialog提供了一个允许用户选择文件或目录的对话框。关于QFileDialog的使用可以参考下面的文档 https://doc.qt.io/qtfo…...
Leetcode1793. Maximum Score of a Good Subarray
给定一个数组和一个下标 k k k 子数组 ( i , j ) (i,j) (i,j)分数定义为 min ( n u m s [ i ] , n u m s [ i 1 ] , ⋯ , n u m s [ j ] ) ∗ ( j − i 1 ) \min\left(nums[i], nums[i 1],\cdots, nums[j]\right)*\left(j-i1\right) min(nums[i],nums[i1],⋯,nums[j])∗(…...
只需五步,在Linux安装chrome及chromedriver(CentOS)
一、安装Chrome 1)先执行命令下载chrome: wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm2)安装chrome yum localinstall google-chrome-stable_current_x86_64.rpm看到下图中的Complete出现则代表安装…...
第01章-Java语言概述
目录 1 常见DOS命令 常用指令 相对路径与绝对路径 2 转义字符 3 安装JDK与配置环境变量 JDK与JRE JDK的版本 JDK的下载 JDK的安装 配置path环境变量 4 Java程序的编写与执行 5 Java注释 6 Java API文档 7 Java核心机制:JVM 1 常见DOS命令 DOS(…...
Spring | Spring Cache 缓存框架
Spring Cache 缓存框架: Spring Cache功能介绍Spring Cache的Maven依赖Spring Cache的常用注解EnableCaching注解CachePut注解Cacheable注解CacheEvict注解 Spring Cache功能介绍 Spring Cache是Spring的一个框架,实现了基于注解的缓存功能。只需简单加一…...
雷达开发的基本概念fft,cfar,以及Clutter, CFAR,AoA
CFAR Constant False-Alarm Rate的缩写。在雷达信号检测中,当外界干扰强度变化时,雷达能自动调整其灵敏度,使雷达的虚警概率保持不变。具有这种特性的接收机称为恒虚警接收机。雷达信号的检测总是在干扰背景下进行的,这些干扰包括…...
突破平台壁垒:3种方法让Windows直接运行安卓应用
突破平台壁垒:3种方法让Windows直接运行安卓应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 当你在电脑前急需使用手机专属办公软件,却只能…...
镜像孪生系统总体技术方案白皮书——基于三维空间计算的全域视频智能感知与决策平台
镜像孪生系统总体技术方案白皮书——基于三维空间计算的全域视频智能感知与决策平台发布单位:镜像视界(浙江)科技有限公司 版本:V1.0 日期:2026年📌 摘要随着智慧城市、公共安全与数字政府建设的不断推进&a…...
Amber与Kemal框架深度对比:为什么选择Amber开发企业级应用
Amber与Kemal框架深度对比:为什么选择Amber开发企业级应用 【免费下载链接】amber A Crystal web framework that makes building applications fast, simple, and enjoyable. Get started with quick prototyping, less bugs, and blazing fast performance. 项目…...
用Python从零实现电池SOC估算:基于LSTM的实战教程(含数据集)
用Python从零实现电池SOC估算:基于LSTM的实战教程(含数据集) 电池管理系统(BMS)中,荷电状态(SOC)的精确估算直接影响设备续航表现与安全阈值控制。传统方法在动态工况下常面临精度衰…...
『小程序/视频号直播』重磅上线|Tigshop JAVA v5.8.21 正式发布
Tigshop JAVA 全产品「小程序 / 视频号直播」功能重磅上线!本次 Tigshop开源商城系统JAVA v5.8.21 版本升级以私域直播为核心,优化商城服务体验、提升交易转化效率,同时全面修复已知问题,进一步提升系统稳定性,为商家打…...
3步安全获取阿里云盘Refresh Token:从工具部署到高效应用指南
3步安全获取阿里云盘Refresh Token:从工具部署到高效应用指南 【免费下载链接】aliyundriver-refresh-token QR Code扫码获取阿里云盘refresh token For Web 项目地址: https://gitcode.com/gh_mirrors/al/aliyundriver-refresh-token 在云存储自动化管理领域…...
使用OpenSSL转换Fiddler证书为安卓系统格式的完整指南
1. 为什么需要转换Fiddler证书格式 很多安卓开发者都遇到过这样的问题:在Android 7.0及以上版本的设备上,即使安装了Fiddler的CA证书,仍然无法抓取某些应用的HTTPS流量。这是因为从Android 7.0开始,系统默认只信任系统证书存储区…...
英国人正在减少社交媒体发帖,网络态度趋于保守
英国成年人在社交媒体上的活跃度持续下滑。据英国电信监管机构Ofcom最新数据显示,目前仅有一半用户会主动发布内容,且认为上网利大于弊的人数也在减少。Ofcom对一批成年人的媒体使用情况及态度进行了调查,结果发现,主动在社交媒体…...
精益目视设计全指南 | 2026工厂目视化从0到1全流程(第一弹)
2026 年,精益生产早已成为制造企业降本增效、规范管理的核心抓手,而精益目视设计(精益目视化设计),正是精益生产、5S/6S 管理、TPM 设备管理落地的核心载体,被称为现场管理的 “无声管理者”。但绝大多数工…...
如何让旧款Mac重获新生:OpenCore Legacy Patcher的系统延续方案
如何让旧款Mac重获新生:OpenCore Legacy Patcher的系统延续方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当你面对一台性能尚可但被苹果官方…...
