leetcode第一刷_Clone Graph
2014-05-05 09:57
351 查看
这道题相当的恶心,写了好多遍,最后的结果也不满意。主要是对图的数据结构不太熟悉,还有大量的复制操作和指针。
我的解法是,用一个队列保存原图中的节点,每个节点只入队出队一次,否则会超时,而复制前后label值是一致的且所有的label不同,因此可以用map来存放。每次遇到一个新节点的时候,就分配空间,但是每次循环只复制一个节点。如果这个节点在之前节点的neighbor中出现过,那么它的空间已经分配了,只不过neighbor还没更新,就直接从map中取出它的指针即可。根据队列中的原图节点,复制这个节点的neighbor,要一个一个的加入结构体中因为可能还有未访问过的label,要为他分配空间。
实现的时候,我用了一些中间的变量,以求写的时候方便一些。vector是重载过复制操作符的,如果他里面放的确实是指针,可以直接“=”复制的,assigne方法起到的作用一样。我一开始把map什么的都放在方法的外面,总是报错,移到里面就ac了。
我的解法是,用一个队列保存原图中的节点,每个节点只入队出队一次,否则会超时,而复制前后label值是一致的且所有的label不同,因此可以用map来存放。每次遇到一个新节点的时候,就分配空间,但是每次循环只复制一个节点。如果这个节点在之前节点的neighbor中出现过,那么它的空间已经分配了,只不过neighbor还没更新,就直接从map中取出它的指针即可。根据队列中的原图节点,复制这个节点的neighbor,要一个一个的加入结构体中因为可能还有未访问过的label,要为他分配空间。
实现的时候,我用了一些中间的变量,以求写的时候方便一些。vector是重载过复制操作符的,如果他里面放的确实是指针,可以直接“=”复制的,assigne方法起到的作用一样。我一开始把map什么的都放在方法的外面,总是报错,移到里面就ac了。
class Solution { public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if(node == NULL) return NULL; map<int, UndirectedGraphNode *> visited; queue<UndirectedGraphNode *> que; vector<UndirectedGraphNode *> pvec; vector<UndirectedGraphNode *> newNeighbors; UndirectedGraphNode *pNode, *newNode, *pNeighbor; que.push(node); while(!que.empty()){ pNode = que.front(); que.pop(); if(visited.find(pNode->label) == visited.end()){ newNode = new UndirectedGraphNode(pNode->label); visited[pNode->label] = newNode; }else{ newNode = visited[pNode->label]; } pvec.assign(pNode->neighbors.begin(), pNode->neighbors.end()); for(int i=0;i<pvec.size();i++){ if(visited.find(pvec[i]->label) == visited.end()){ pNeighbor = new UndirectedGraphNode(pvec[i]->label); newNeighbors.push_back(pNeighbor); visited[pNeighbor->label] = pNeighbor; que.push(pvec[i]); }else{ newNeighbors.push_back(visited[pvec[i]->label]); } } newNode->neighbors.assign(newNeighbors.begin(), newNeighbors.end()); newNeighbors.clear(); pvec.clear(); } return visited[node->label]; } };
相关文章推荐
- leetcode第一刷_Restore IP Addresses
- leetcode第一刷_Interleaving String
- leetcode第一刷_Palindrome Number
- [leetcode]解决Clone Graph的一点小心得
- leetcode第一刷_Linked List Cycle
- leetcode第一刷_Convert Sorted Array to Binary Search Tree
- leetcode第一刷_Maximum Depth of Binary Tree
- leetcode第一刷_Merge Two Sorted Lists
- leetcode第一刷_Spiral Matrix II
- leetcode第一刷_Combination Sum Combination Sum II
- leetcode第一刷_Search for a Range
- leetcode第一刷_Roman to Integer
- leetcode:292 Nim Game-每日编程第一题
- LeetCode刷题之第一题——TwoSum
- [leetcode]Clone Graph
- leetcode第一刷_Triangle
- leetcode第一刷_Permutations II
- leetcode Clone Graph
- leetcode第一刷_Unique Binary Search Trees
- leetcode第一刷_Reverse Words in a String