【leetcode】clone-graph
寫在前面的話:
看了看自己的博客,從一月底開始就沒怎么更新過,我也確實(shí)將近5個(gè)月沒怎么寫代碼了。今天突然覺得有些心慌,感覺手都已經(jīng)生疏了。果然,隨便找了道題就卡住了。隱約感覺要用map但又不太記得用法了,知道可以用DFS或BFS卻又理不清思路。費(fèi)了兩個(gè)小時(shí),結(jié)果寫了一個(gè)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?#.
?
Visually, the graph looks like the following:
1/ \/ \0 --- 2/ \\_/?
我的解法:
反應(yīng)了好久,才發(fā)現(xiàn)題目的難點(diǎn)是防止結(jié)點(diǎn)的重復(fù)建立。我的方法沒有用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) {//獲取所有獨(dú)立的結(jié)點(diǎn)vector<UndirectedGraphNode *> UniqueNodes;getUniqueNodes(node, UniqueNodes);return findNode(node, UniqueNodes);}//查找指定結(jié)點(diǎn)并返回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;}//獲取圖中所有的結(jié)點(diǎn)和連接信息void getUniqueNodes(UndirectedGraphNode *node, vector<UndirectedGraphNode *>& UniqueNodes){//結(jié)點(diǎn)空或已存在時(shí)直接返回if(NULL == node || NULL != findNode(node, UniqueNodes))return;//存儲(chǔ)新出現(xiàn)的結(jié)點(diǎn)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; }?
網(wǎng)上大神解法
/*** 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];} };?
總結(jié)
以上是生活随笔為你收集整理的【leetcode】clone-graph的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二十六天 iptables的nat功能
- 下一篇: delete表1条件是另一个表中的数据,