Leetcode 310. Minimun Height Trees使用set快速删除元素
2016-02-29 15:16
387 查看
set是C++STL中的一种集合类型,可以实现对元素的查找、添加、删除、修改。Set是一个集合,其中不能包含重复元素。删除set中的指定元素是一种很常见的操作,使用迭代器即可。例如:
但是,这样的方式需要遍历整个集合,时间复杂度为O(n)。事实上,set的erase函数可以直接传入想要删除的元素作为参数,在O(1)时间内完成删除操作。例如:
有关set的这个用法是本人在刷leetcode上的题310. Minimum Height Trees时搜到的。这里使用set保存图中每一个顶点的邻接点,在执行类拓扑排序的过程中可以很方便的实现删除顶点操作。之前使用vector一直报时间超时,换成set后直接通过。本题代码如下:
这道题的思路和拓扑排序类似,依次处理度数为1的顶点并删除之,修改与被删除顶点邻接的顶点度数。反复执行以上过程直至剩余的顶点数量不超过2即所要获得的解。
void delete_set(set<int> &s,int m){ set<int>::iterator it; for(it=s.begin();it!=s.end();){ if( *it == m ){ s.erase(it); break; } } }
但是,这样的方式需要遍历整个集合,时间复杂度为O(n)。事实上,set的erase函数可以直接传入想要删除的元素作为参数,在O(1)时间内完成删除操作。例如:
set<int> s; s.insert(5); cout << s.size() << endl;//打印出1 s.erase(5); cout << s.size() << endl;//打印出0
有关set的这个用法是本人在刷leetcode上的题310. Minimum Height Trees时搜到的。这里使用set保存图中每一个顶点的邻接点,在执行类拓扑排序的过程中可以很方便的实现删除顶点操作。之前使用vector一直报时间超时,换成set后直接通过。本题代码如下:
vector<int> findMinHeightTrees(int n, vector<pair<int, int>>& edges) { map<int,set<int>> graph; queue<int> q; vector<int> result; int *degree = new int ; for(int i=0;i < n; i++) degree[i]=0; if( n == 1){ result.push_back(0); return result; } int rest=n; for(int i=0;i < edges.size(); i++){ degree[edges[i].first]++; degree[edges[i].second]++; if( graph.find(edges[i].first) == graph.end()){ graph[edges[i].first] = set<int>(); } if( graph.find(edges[i].second) == graph.end()){ graph[edges[i].second] = set<int>(); } graph[edges[i].first].insert(edges[i].second); graph[edges[i].second].insert(edges[i].first); } for(int i=0;i < n; i++){ if( degree[i] == 1){ q.push(i); rest--; } } while( rest > 0 ){ queue<int> c; while( !q.empty() ){ int p=q.front(); q.pop(); auto it = graph[p].begin(); degree[*it]--; graph[*it].erase(p); if( degree[*it] == 1){ c.push(*it); rest--; } } q=c; } while( !q.empty()){ result.push_back(q.front()); q.pop(); } return result; }
这道题的思路和拓扑排序类似,依次处理度数为1的顶点并删除之,修改与被删除顶点邻接的顶点度数。反复执行以上过程直至剩余的顶点数量不超过2即所要获得的解。
相关文章推荐
- 带有指示器的自定义底部导航栏的实现
- linux syslog详解
- UVA 133(82)----The Dole Queue
- leetcode 202. Happy Number
- H5单页面架构:自定义路由 + requirejs + zepto + underscore
- LeetCode Copy List with Random Pointer
- 《JAVA与模式》学习之装饰模式
- UIKit框架(12)控制器view的生命周期方法
- Linux分区
- 关于屏幕常亮的问题
- android电池充电以及电量检测驱动分析
- 5分钟弄懂Docker!
- JSON入门
- 第七天
- Android控件— — —ImageView
- transmission简单使用
- map容器的插入(伪复制)遇到的默认构造问题
- 驱动安装注册表指令
- spring-jms的applicationContext.xml
- 隐藏android中EditText的下划线