【leetcode】clone-graph

写在前面的话:

  看了看自己的博客,从一月底开始就没怎么更新过,我也确实将近5个月没怎么写代码了。今天突然觉得有些心慌,感觉手都已经生疏了。果然,随便找了道题就卡住了。隐约感觉要用map但又不太记得用法了,知道可以用DFS或BFS却又理不清思路。费了两个小时,结果写了一个shit一样的代码才通过。唉好忧伤啊。

 

 

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.


OJ's undirected graph serialization:

Nodes are labeled uniquely.

We use # as a separator for each node, and , as a separator for node label and each neighbor of the node.

 

As an example, consider the serialized graph {0,1,2#1,2#2,2}.

The graph has a total of three nodes, and therefore contains three parts as separated by #.

  1. First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
  2. Second node is labeled as 1. Connect node 1 to node 2.
  3. Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.

 

Visually, the graph looks like the following:

       1/ \/   \0 --- 2/ \\_/

 

我的解法:

反应了好久,才发现题目的难点是防止结点的重复建立。我的方法没有用map,很繁琐。

#include<iostream>
#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std;struct UndirectedGraphNode {int label;vector<UndirectedGraphNode *> neighbors;UndirectedGraphNode(int x) : label(x) {};};
class Solution {
public:UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {//获取所有独立的结点vector<UndirectedGraphNode *> UniqueNodes;getUniqueNodes(node, UniqueNodes);return findNode(node, UniqueNodes);}//查找指定结点并返回UndirectedGraphNode * findNode(UndirectedGraphNode * node, vector<UndirectedGraphNode *> UniqueNodes){if(NULL == node)return NULL;for(int i = 0; i < UniqueNodes.size(); i++){if(node->label == UniqueNodes[i]->label){return UniqueNodes[i];}}return NULL;}//获取图中所有的结点和连接信息void getUniqueNodes(UndirectedGraphNode *node, vector<UndirectedGraphNode *>& UniqueNodes){//结点空或已存在时直接返回if(NULL == node || NULL != findNode(node, UniqueNodes))return;//存储新出现的结点UndirectedGraphNode * newNode = new UndirectedGraphNode(node->label);UniqueNodes.push_back(newNode);for(int i = 0; i < node->neighbors.size(); i++){getUniqueNodes(node->neighbors[i], UniqueNodes);newNode->neighbors.push_back(findNode(node->neighbors[i], UniqueNodes));}}
};int main()
{Solution s;UndirectedGraphNode * node0 = new UndirectedGraphNode(0);UndirectedGraphNode * node1 = new UndirectedGraphNode(1);UndirectedGraphNode * node2 = new UndirectedGraphNode(2);node0->neighbors.push_back(node1);node0->neighbors.push_back(node2);node1->neighbors.push_back(node2);node2->neighbors.push_back(node2);UndirectedGraphNode * newNode = s.cloneGraph(node0);return 0;
}

 

网上大神解法

/*** Definition for undirected graph.* struct UndirectedGraphNode {*     int label;*     vector<UndirectedGraphNode *> neighbors;*     UndirectedGraphNode(int x) : label(x) {};* };*/
class Solution {
private:unordered_map<UndirectedGraphNode*,UndirectedGraphNode*> hash;
public://BFSUndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {if(!node) return NULL;queue<UndirectedGraphNode*> Qu;Qu.push(node);hash[node] = new UndirectedGraphNode(node->label);while(!Qu.empty()){UndirectedGraphNode * tmp = Qu.front();Qu.pop();for(UndirectedGraphNode * neighbor : tmp->neighbors){if(hash.find(neighbor) == hash.end()){hash[neighbor] = new UndirectedGraphNode(neighbor->label);Qu.push(neighbor);}hash[tmp]->neighbors.push_back(hash[neighbor]);}}return hash[node];}//DFSUndirectedGraphNode *cloneGraph1(UndirectedGraphNode *node) {if(!node) return NULL;if(hash.find(node) == hash.end()){hash[node] = new UndirectedGraphNode(node->label);for(UndirectedGraphNode* neighbor : node->neighbors){hash[node]->neighbors.push_back(cloneGraph1(neighbor));}}return hash[node];}
};

 

转载于:https://www.cnblogs.com/dplearning/p/5625408.html

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

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

相关文章

【javascript高级教程】JavaScript 字符串(String) 对象

String 对象用于处理已有的字符块。 JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号&#xff1a; var carname"Volvo XC60"; var carnameVolvo XC60; 你使用位置&#xff08;索引&#xff09;可以…

Redis教程:NoSQL键值存储

课程大纲 Redis是使用ANSI C编写的具有可选持久性的开源&#xff0c;网络化&#xff0c;内存中键值数据存储。根据DB-Engines.com的月度排名&#xff0c;Redis是最受欢迎的键值存储。 它的名字意思是远程字典服务器。 Redis已获得BSD许可&#xff0c;并且通常被称为数据结构服…

java 里面eaquls和==区别

java中的数据类型&#xff0c;可分为两类&#xff1a; 1.基本数据类型&#xff0c;也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较&#xff0c;应用双等号&#xff08;&#xff09;,比较的是他们的值。 2.复合数据类型(类) 当他们用…

【javascript高级教程】JavaScript Array(数组) 对象

数组对象的作用是&#xff1a;使用单独的变量名来存储一系列的值。 创建数组, 为其赋值&#xff1a; var mycars new Array(); mycars[0] "Saab"; mycars[1] "Volvo"; mycars[2] "BMW"; 什么是数组? 数组对象是使用单独的变量名来存储一…

Chrome 开发工具之Network

经常会听到比如"为什么我的js代码没执行啊&#xff1f;","我明明发送了请求&#xff0c;为什么反应&#xff1f;","我这个网站怎么加载的这么慢&#xff1f;"这类的问题&#xff0c;那么问题既然存在&#xff0c;就需要去解决它&#xff0c;需要…

【javascript高级教程】JavaScript Date(日期) 对象

日期对象用于处理日期和时间。 创建日期 Date 对象用于处理日期和时间。 可以通过 new 关键词来定义 Date 对象。以下代码定义了名为 myDate 的 Date 对象&#xff1a; 有四种方式初始化日期: new Date(); new Date(value); new Date(dateString); new Date(year, monthI…

实用常识_实用垃圾收集,第1部分–简介

实用常识这是我打算写的一系列博客文章的第一部分&#xff0c;其目的是解释垃圾回收在现实世界中如何工作&#xff08;尤其是在JVM中 &#xff09;。 我将介绍一些我认为对于充分理解垃圾收集对于实际目的是必需的理论&#xff0c;但是将其降至最低。 其动机是在各种情况下&…

重写AgileEAS.NET SOA 中间件平台账号密码的加密算法

一、平台简介 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台。用于帮助中小型软件企业建立一条适合市场快速变化的开发团队&#xff0c;以达到节省开发成本、缩短开发时间&#xff0c;快速适应市…

Java中的堆栈安全递归

在本文中&#xff0c;摘自《 Java中的函数式编程 》一书&#xff0c;我解释了如何使用递归&#xff0c;同时避免了StackOverflow异常的风险。 Corecursion正在使用第一步的输出作为下一步的输入来构成计算步骤。 递归是相同的操作&#xff0c;但是从最后一步开始。 在这种情况…

数字化经营支付3.0有哪些盈利机会

实体商户的现状 服务商经营现状 官方政策支持 微信平台通过多渠道助力商户发放 优惠券,如扫码领券、API领券、支 付有礼、附近3公里等形式,给商户 做引流拓客。

nessus重置密码

许久不用的nessus密码居然忘记了&#xff0c;查了下&#xff1a; cmd下进入到nessus的安装目录 提升为管理员&#xff0c;登录系统 如果想用之前的账号&#xff0c;可以直接在系统内重置密码。转载于:https://www.cnblogs.com/nayu/p/5640527.html

程序员有哪些可以写博客的网站?

俗话说&#xff1a;好记性不如烂笔头&#xff0c;作为一名合格的程序员还是抽时间写写博客的&#xff0c;马云曾说“成功的人有两个特质&#xff0c;一个是喜欢写作&#xff0c;一个是喜欢演讲”&#xff0c;我觉得吧&#xff0c;写作一是为了总结&#xff0c;二是督促自己成长…

微信支付 h5

Android开发要点说明 商户在微信开放平台申请开发应用后&#xff0c;微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全&#xff0c;需要在开放平台绑定商户应用包名和应用签名&#xff0c;设置好后才能正常发起支付。 应用包名&#xff1a;是在APP项目配置文件And…

工厂方法设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

2022年java学习路线指南

目录 1.Java语言核心 2.JavaWEB前后端交互基础 3.企业常用技术 4.分布式系统 5.互联网架构技术

2022年最新UI/UE学习路线图

目录 1.软件与平面基础 2.互联网插画 3.互联网运营设计 4.C4D三维制作 5.UI设计基础

CentOS下mysql数据库常用命令总结

mysql数据库使用总结 本文主要记录一些mysql日常使用的命令&#xff0c;供以后查询。 1.更改root密码 mysqladmin -uroot password yourpassword 2.远程登陆mysql服务器 mysql -uroot -p -h192.168.137.10 -P3306 3.查询数据库 show databases; 4.进入某个数据库 use databasen…

2022年最新javaEE学习路线图

目录 1.java语言核心 2.java与数据库交互技术 3.javaWeb前后端交互技术基础 4.javaEE框架阶段

jmx jolokia_使用Jolokia和JMX进行客户端服务器监视

jmx jolokiaJava监视工具的选择非常广泛&#xff08;由Google提供的随机选择和顺序&#xff09;&#xff1a; javamelody 压力探头 JVisualVM 控制台 贾蒙 Java JMX Nagios插件不适用 此外&#xff0c;还有各种专用工具&#xff0c;例如ActiveMQ &#xff0c; JBoss &…

利用 %20 替换 空格

将字符串中的空格都替换为 %20 &#xff08; 时间复杂度为O&#xff08;N&#xff09;的解法 &#xff09; void ReplaceBlankSpace(char* arr){if (arr){int count 0;int lenth strlen(arr);for (int i 0; i < lenth;i)if (arr[i] )count;char*before arrlenth, *beh…