building outline 问题及set, mutilset以及堆的一些理解
2015-05-26 14:37
281 查看
1扫描线法,需要考虑的就是当来一条竖线的时候,需要更新什么
2本例中,只需要考虑 是否更新当前最高高度的起点curX,是否产生一个输出。还有扫描线法固定的步骤:当起点来时候加进一个高度,当终点来时移除对应的高度。
3循环不变式:curX是当前outline的起点,堆里的最大高度就是当前outline的高度。当一个面来时:
1)堆是空的(没有建筑)进入一个outline, 记录curX
2) 当 新来的面坐标大于当前outline起点curX,且:
高度大于当前outline高度,
或者 高度等于当前outline高度,但是一个终点,且堆里面这个高度的建筑只剩下一个
当前outline结束,产生一个输出,更新curX
3)起点堆里加入建筑的高度,终点从堆里移除建筑高度
vector<vector<int> > buildingOutline(vector<vector<int> > &buildings) {
if (buildings.empty()) return vector<vector<int>>();
vector<vector<int>> sides;
for (auto &b : buildings) {
sides.push_back({ b[0], 0, b[2] });
sides.push_back({ b[1], 1, b[2] });
}
sort(sides.begin(), sides.end());
int x = 0;
vector<vector<int>> res;
multiset<int> q;
for (auto &side : sides) {
if (q.empty()) x = side[0];
else {
auto maxH = *q.rbegin();
if (side[0] > x && (side[2] > maxH ||
side[2] == maxH && side[1] == 1 && q.count(side[2]) == 1))
{
res.push_back({ x, side[0], maxH });
x = side[0];
}
}
if (side[1] == 0) q.insert(side[2]);
else q.erase(q.find(side[2]));
}
return res;
}
关于set, multiset 和 堆
堆只是取最小值这一个操作是O(1)的,总体还是O(lgn)的。因为一般都是插入,查询,删除交织进行的。set可以删除任意元素,可以同时维护最大值最小值和任意第k大。
可以用set + 自己维护一个minValue变量实现堆(O(1)取最值)
multiset可以有重复,删除的时候注意用s.erase(s.find(key)),而不是s.erase(key),前者只删除一个,后者删除所有
2本例中,只需要考虑 是否更新当前最高高度的起点curX,是否产生一个输出。还有扫描线法固定的步骤:当起点来时候加进一个高度,当终点来时移除对应的高度。
3循环不变式:curX是当前outline的起点,堆里的最大高度就是当前outline的高度。当一个面来时:
1)堆是空的(没有建筑)进入一个outline, 记录curX
2) 当 新来的面坐标大于当前outline起点curX,且:
高度大于当前outline高度,
或者 高度等于当前outline高度,但是一个终点,且堆里面这个高度的建筑只剩下一个
当前outline结束,产生一个输出,更新curX
3)起点堆里加入建筑的高度,终点从堆里移除建筑高度
vector<vector<int> > buildingOutline(vector<vector<int> > &buildings) {
if (buildings.empty()) return vector<vector<int>>();
vector<vector<int>> sides;
for (auto &b : buildings) {
sides.push_back({ b[0], 0, b[2] });
sides.push_back({ b[1], 1, b[2] });
}
sort(sides.begin(), sides.end());
int x = 0;
vector<vector<int>> res;
multiset<int> q;
for (auto &side : sides) {
if (q.empty()) x = side[0];
else {
auto maxH = *q.rbegin();
if (side[0] > x && (side[2] > maxH ||
side[2] == maxH && side[1] == 1 && q.count(side[2]) == 1))
{
res.push_back({ x, side[0], maxH });
x = side[0];
}
}
if (side[1] == 0) q.insert(side[2]);
else q.erase(q.find(side[2]));
}
return res;
}
关于set, multiset 和 堆
堆只是取最小值这一个操作是O(1)的,总体还是O(lgn)的。因为一般都是插入,查询,删除交织进行的。set可以删除任意元素,可以同时维护最大值最小值和任意第k大。
可以用set + 自己维护一个minValue变量实现堆(O(1)取最值)
multiset可以有重复,删除的时候注意用s.erase(s.find(key)),而不是s.erase(key),前者只删除一个,后者删除所有
相关文章推荐
- 使用redis缓存数据需要注意的问题以及个人的一些思考和理解
- 使用redis缓存数据需要注意的问题以及个人的一些思考和理解
- ~ 使用redis缓存数据需要注意的问题以及个人的一些思考和理解
- C++Builder中关于INDY库的使用 以及一些问题的解决(E2238 Multiple declaration for 'fd_set')
- C语言相关的指针以及一些问题的理解(2014-2-21)
- 对于宽字节注入字符的一些问题以及理解
- 使用redis缓存数据需要注意的问题以及个人的一些思考和理解
- 理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题
- svn "cannot set LC_CTYPE locale" 问题以及LANG, LC_CTYPE, LC_ALL值的设置
- chrome插件开发之:关于一些设定变量以及变量存储的问题
- 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结.
- 11.29编程中遇到的一些问题以及解决办法
- Class.getResource 等等各种获取路径以及一些问题总结
- dispatch_set_target_queue一些理解
- 关于文件分页时候的一些问题。以及解决方案。
- STL中关于map和set的一些问题
- 练习webpack遇到的一些问题以及解决办法,供自己以后参考
- PowerDesigner16.5快速入门显示,注释comment配置方法,以及创建sql文件过程中需要注意的一些问题
- 用汇编语言角度来理解C语言的一些问题
- IOS7 遇到的一些 frame适配 问题以及解决