题目描述
思路分析
扫描线问题。扫描线常伴随“线段树”,故该题归类于数据结构。
每段维护最高的边,根据点要分类讨论。细节先学“扫描线”
代码实现
class Solution {
public:
vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
vector<vector<int>> ans;
vector<pair<int,int>> points;
multiset<int> h;
for(auto item:buildings){
points.push_back({item[0],-item[2]});
points.push_back({item[1],item[2]});
}
sort(points.begin(),points.end());
h.insert(0);
for(auto p:points){
int x=p.first,y=abs(p.second);
if(p.second<0){ //左端点
if(y>*h.rbegin()){
ans.push_back({x,y});
}
h.insert(y);
}
else{ //右端点
h.erase(h.find(y));
if(y>*h.rbegin()){
ans.push_back({x,*h.rbegin()});
}
}
}
return ans;
}
};