LeetCode题练习与总结:克隆图--133

news2024/12/31 5:23:07

一、题目描述

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 valint) 和其邻居的列表(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 = []
输出:[]
解释:这个图是空的,它不含任何节点。

提示:

  • 这张图中的节点数在 [0, 100] 之间。
  • 1 <= Node.val <= 100
  • 每个节点值 Node.val 都是唯一的,
  • 图中没有重复的边,也没有自环。
  • 图是连通图,你可以从给定节点访问到所有节点。

二、解题思路

这个问题是图遍历和复制的问题。可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历图。遍历过程中,需要记录已经访问过的节点,以避免重复访问。同时,在复制每个节点时,需要复制它的邻居列表。

具体步骤如下:

1. 检查输入节点是否为空。如果为空,返回null。

2. 创建一个HashMap来存储原始节点和对应的克隆节点,用于避免重复克隆。

3. 使用DFS或BFS遍历图,对于每个访问的节点:

  • 如果该节点已经在HashMap中,说明已经克隆过,直接从HashMap中获取克隆节点。
  • 如果该节点不在HashMap中,创建一个新的克隆节点,并将原始节点和克隆节点的映射关系存入HashMap。
  • 遍历原始节点的邻居列表,对于每个邻居节点,递归地进行克隆操作,并将克隆后的邻居节点添加到克隆节点的邻居列表中。

4. 返回HashMap中存储的输入节点的克隆节点。

三、具体代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class Solution {
    public Node cloneGraph(Node node) {
        if (node == null) {
            return null;
        }
        HashMap<Node, Node> visited = new HashMap<>();
        return dfs(node, visited);
    }

    private Node dfs(Node node, HashMap<Node, Node> visited) {
        if (visited.containsKey(node)) {
            return visited.get(node);
        }
        Node cloned = new Node(node.val, new ArrayList<>());
        visited.put(node, cloned);
        for (Node neighbor : node.neighbors) {
            cloned.neighbors.add(dfs(neighbor, visited));
        }
        return cloned;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 对于每个节点,我们只访问一次,因为一旦一个节点被克隆并放入visited哈希表中,我们就不会再次克隆它。
  • 对于每个节点,我们需要遍历其所有的邻居节点,并进行克隆。
  • 假设图中一共有N个节点和E条边,那么每个节点都会被访问一次,每条边也会被访问一次(因为每条边都会使我们在邻居节点之间进行一次转移)。
  • 因此,时间复杂度为O(N + E),其中N是节点数,E是边数。
2. 空间复杂度
  • 我们需要一个visited哈希表来存储已经访问过的节点和它们的克隆节点,这个哈希表的大小与节点数N成正比。
  • 递归调用栈的最大深度取决于图的最大深度,也就是图中的最长路径。在最坏的情况下,图可能是一个链状结构,递归调用栈的深度为N
  • 因此,空间复杂度也是O(N),主要取决于visited哈希表和递归调用栈的空间消耗。

综上所述,该算法的时间复杂度为O(N + E),空间复杂度为O(N)

五、总结知识点

  1. 图的深度优先搜索(DFS):这是一种用于遍历或搜索树或图的算法。在这个算法中,我们从一个节点开始,探索尽可能深的分支,直到目标节点,然后回溯到之前的分支点,探索新的分支。

  2. 递归dfs函数是递归的,它调用自身来处理图的每个节点和它们的邻居。

  3. 哈希表(HashMap)visited是一个哈希表,用于存储已经访问过的节点和它们的克隆。它提供了快速的查找和插入操作,这对于避免重复克隆节点至关重要。

  4. 引用类型和值类型:在Java中,Node是一个引用类型,这意味着visited哈希表中存储的是节点的引用,而不是节点的副本。

  5. 链表(ArrayList)ArrayList用于存储节点的邻居列表。它是一个可调整大小的数组实现,提供了对列表的快速随机访问。

  6. 对象的创建和初始化new Node(node.val, new ArrayList<>())创建了一个新的Node对象,并使用节点值和空的邻居列表进行了初始化。

  7. 迭代for循环用于迭代节点的邻居列表,对每个邻居节点调用dfs函数。

  8. 函数返回值dfs函数返回克隆后的节点,这允许递归调用将克隆的邻居节点添加到当前节点的邻居列表中。

  9. 基础数据结构操作:代码中涉及了哈希表和列表的基本操作,如添加元素(putadd)和检查元素是否存在(containsKey)。

  10. 边界条件处理:代码首先检查输入节点是否为空,这是处理图问题时常见的边界条件。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

【EndNote】EndNote进行文献管理可能遇到的问题和解决方案

一、安装GB/T7714-2015(numberic)文献style windows&#xff1a;https://blog.csdn.net/qq_36235935/article/details/115629694 mac os&#xff1a;Mac版Endnote 20导入中文参考格式Chinese Std GBT7714 (numeric)-CSDN博客 安装完之后需要调整Author Name格式&#xff1a;…

Linux内核学习——linux内核体系结构(1)

1 Linux内核模式 学习的是Linux 0.11内核&#xff0c;采用的是单内核模式。单内核模式的主要优点是内核代码结构紧凑、执行速度快&#xff0c;但是层次结构性不强。 操作系统如何提供的服务流程&#xff1f; 应用主程序使用指定的参数值执行系统调用指令(int x80)&#xff0…

用进程和线程完成TCP进行通信操作及广播和组播的通信

进程 代码 #include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <signal.h>#includ…

如何使用idea连接Oracle数据库?

idea版本&#xff1a;2021.3.3 Oracle版本&#xff1a;10.2.0.1.0&#xff08;在虚拟机Windows sever 2003 远程连接数据库&#xff09; 数据库管理系统&#xff1a;PLSQL Developer 在idea里面找到database&#xff0c;在idea侧面 选择左上角加号&#xff0c;新建&#xff…

消息队列kafka中间件详解:案例解析(第10天)

系列文章目录 1- 消息队列&#xff08;熟悉&#xff09;2- Kafka的基本介绍&#xff08;掌握架构&#xff0c;其他了解&#xff09;3- Kafka的相关使用&#xff08;掌握kafka常用shell命令&#xff09;4- Kafka的Python API的操作&#xff08;熟悉&#xff09; 文章目录 系列文…

0.15元1.5Mhz-1.3A同步整流BUCK降压DCDC芯片MT3410(MT3410LB)

前言 国产同步整流DCDC&#xff0c;参考价格约0.15元。 特征 高效率&#xff1a;高达 96% 1.5MHz恒定频率操作 1.3A 输出电流 无需肖特基二极管 2.3V至7V输入电压范围 输出电压低至 0.6V PFM 模式可在轻负载下实现高效率 压差操作中的100%占空比 低静态电流&#xff1a;35μ…

开放式耳机哪个品牌质量比较好?五大公认性能之王推荐!

作为一名热爱音乐的DJ爱好者&#xff0c;我当然知道一款适合DJ使用的开放式耳机应该具备哪些特点。最近&#xff0c;我深入评测了几款热门开放式耳机&#xff0c;从音质、舒适度、耐用性到混音功能等方面进行了全面评估。今天&#xff0c;我想为大家分享我的评测结果&#xff0…

可视化数据科学平台在信贷领域应用系列六:自动机器学习(上篇)

在现代数据驱动的世界中&#xff0c;机器学习已经成为解决复杂问题和推动创新的重要手段。然而&#xff0c;传统的机器学习模型开发过程复杂且耗时&#xff0c;包括数据预处理、特征工程、模型选择、参数调优和模型评估等多个步骤环节&#xff0c;需要模型开发人员具备丰富的专…

深圳比创达电子|EMC与EMI一站式解决方案:源头到终端的全面防护

随着电子技术的飞速发展&#xff0c;电磁兼容性&#xff08;EMC&#xff09;和电磁干扰&#xff08;EMI&#xff09;问题日益成为产品研发和生产的关键因素。为了帮助企业更好地应对这些挑战。 一、EMC与EMI的基本概述 电磁兼容性&#xff08;EMC&#xff09;是指设备或系统在…

众爱宠物开源项目介绍

众爱宠物管理系统是一个集会员管理、宠物管理、商品管理、库存管理、数据管理、收银管理、多门店管理等功能于一体的综合管理系统&#xff0c;具有操作方便、简单、安全等优点。 开源项目地址

STM32---SPI通信协议(小白入、含源码)

写在前面&#xff1a;在单片机的学习过程中&#xff0c;各种通信协议的学习是必不可少的&#xff0c;在前面我们学习了串口通信、IIC通信&#xff0c;本节我们来认识一下SPI通信协议。包括其SPI基本概念、NORFLASH芯片的介绍以及相关的例程实验。 目录 一、SPI介绍 1.1什么是…

“一站式企业服务平台”的功能架构

为提升区域营商环境&#xff0c;为促进区域经济发展&#xff0c;实现资源高效配置&#xff0c;全国各区域政府及产业园区都越来越重视如何创新企业服务机制、提升企业服务水平&#xff0c;来保障区域内的企业稳定及帮扶企业高质量的发展。随着近年来大数据、人工智能等新一代信…

V4和V6双栈处理

现进行双栈 对R1 对R2 对R3 对R4 路由地址配完&#xff0c;起协议 然后起ripng&#xff0c;在R2&#xff0c;R3&#xff0c;R4上都宣告一下 然后在PC1和PC2上都手动配置一下就可以了

对比 Axios 和 Fetch:选择最适合的 HTTP 请求方法

在前端开发中&#xff0c;处理 HTTP 请求是一个常见且重要的任务。JavaScript 提供了多种方式来发送网络请求&#xff0c;其中最受欢迎的两种方式分别就是 Fetch API 和 Axios。尽管两者都能完成同样的任务&#xff0c;即从客户端向服务器发送请求并接收响应&#xff0c;但它们…

项目经验——交通行业数据可视化大屏、HMI设计

交通行业数据大屏、HMI设计时要的注意点&#xff1a;清晰可读、简洁直观、适配性强。颜色对比度满足WCAG标准&#xff0c;深色背景减少干扰&#xff0c;实时展示交通数据&#xff0c;支持有线网络控制内容更新&#xff0c;保障驾驶安全与决策效率。

V4L2读取摄像头资源

1.V4L2 它是Linux内核中标准的关于视频驱动程序&#xff0c;Video for Linux 2&#xff0c;简称V4L2。 它为Linux下的视频驱动提供了统一的接口&#xff0c;使得应用程序可以使用统一的API操作不同的视频设备。 V4L2支持三类设备&#xff1a;视频输入输出设备、VBI设备和rad…

飞速(FS)S5850-24XMG多速率交换机如何实现降本增速

在当今网络环境快速发展的背景下&#xff0c;以太网带宽呈现出快速增长的趋势&#xff0c;降低网络迭代成本成为影响企业决策的关键因素。飞速&#xff08;FS&#xff09;S5850-24XMG多速率交换机可提供无缝连接不同数据速率设备的解决方案&#xff0c;本文将探讨飞速&#xff…

day01-Numpy的安装

numpy的安装 同样&#xff0c;anaconda内置有Numpy包 Numpy是用c语言实现的&#xff0c;运算速度比python快得多 import numpy as np np.__version__out: 1.18.5使用Jupyter编辑器打印numpy包的版本 NumPy ndarray对象 NumPy定义了一个n维数组对象&#xff0c;简称ndarra…

vue 登录

1.创建项目 Set-ExecutionPolicy RemoteSigned npm install -g yarn yarn add axios yarn add element-pluspackage.json {"name": "tom6","version": "0.1.0","private": true,"scripts": {"serve": &…

乾元通渠道商中标金昌市自然灾害应急能力提升项目

近日&#xff0c;乾元通渠道商中标甘肃省金昌市自然灾害应急能力提升项目&#xff0c;乾元通作为设备厂家&#xff0c;为项目提供通信指挥类装备&#xff08;多链路聚合设备&#xff09; QYT-X1 。 随着万亿国债项目的全面铺开&#xff0c; 青岛乾元通数码科技有限公司 作为国家…