leetcode--Clone Graph
2015-08-02 22:05
519 查看
Depth-first search 深度优先算法,举个例子:二叉树中的前序遍历,一般用递归实现;
Breadth-first search 广度优先算法,举个例子:二叉树的层序遍历,需要用队列实现。
method1:DFS
用map记录已经出现过的节点。
C++要注意:vector不能通过下标增加原来没有的原素,map可以; new 和malloc一样返回指针
理论上应该是BFS比较快,因为没有递归调用,但是两个程序的验证时间DFS比较快,可能是程序还可以优化,也可能是因为使用queue?
Breadth-first search 广度优先算法,举个例子:二叉树的层序遍历,需要用队列实现。
method1:DFS
UndirectedGraphNode *DFS(UndirectedGraphNode *node, unordered_map<int, UndirectedGraphNode *> *existed){ if (node == NULL) return NULL; UndirectedGraphNode *ret; if ((*existed).find(node->label) == (*existed).end()) { ret = new UndirectedGraphNode(node->label); (*existed)[node->label] = ret; } else { ret = (*existed)[node->label]; return ret; } int n = node->neighbors.size(); int i = 0; while (i<n){ ret->neighbors.push_back( DFS(node->neighbors[i],existed)); i++; } return ret; } UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if (node == NULL) return NULL; unordered_map<int, UndirectedGraphNode *> *existed = new unordered_map<int, UndirectedGraphNode *>; return DFS(node, existed); }method 2:BFS
UndirectedGraphNode *cloneGraphII(UndirectedGraphNode *node) { if (node == NULL) return NULL; unordered_map<int, UndirectedGraphNode *> visited; queue<UndirectedGraphNode *> Q; UndirectedGraphNode *head = new UndirectedGraphNode(node->label); visited.insert({ node->label, head }); Q.push(node); while (Q.size() > 0) { UndirectedGraphNode *tmp = Q.front(); Q.pop(); int n = tmp->neighbors.size(); head = visited[tmp->label]; for (int i = 0; i < n; ++i) { if (visited.find(tmp->neighbors[i]->label) == visited.end()) { head->neighbors.push_back(new UndirectedGraphNode(tmp->neighbors[i]->label)); Q.push(tmp->neighbors[i]); visited[tmp->neighbors[i]->label] = head->neighbors[i]; } else { head->neighbors.push_back(visited[tmp->neighbors[i]->label]); } } } return visited[node->label]; }
用map记录已经出现过的节点。
C++要注意:vector不能通过下标增加原来没有的原素,map可以; new 和malloc一样返回指针
理论上应该是BFS比较快,因为没有递归调用,但是两个程序的验证时间DFS比较快,可能是程序还可以优化,也可能是因为使用queue?
相关文章推荐
- 【Nginx-反向代理服务器】基础知识(一)之事件处理机制
- CentOS 6.6 中设置Terminal快捷键
- iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- Android初级第三次小结
- IOS开发初学--XCODE篇
- 数据结构基础 排序算法(一) 概念篇
- Rotate Image (LeetCode)
- Android初级第二次小结
- 初时MVC
- 双向循环链表
- 【CF 520D】Cubes
- 2015暑假集训
- leancloud js SDK 学习
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- Java中的内存泄漏分析说明
- siva理论在网络营销中的案例分析
- hdu 4902 Nice boat (线段树)
- UVa 11081 - Strings(dp)
- equals 跟== 的区别
- App在发布后监测崩溃情况