題目:218. The Skyline Problem
難度:困難
類型:掃描線 大根堆 平衡二叉樹
星級:五星推薦
class Solution {
public:
vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
//注意重疊 建築的左邊重疊先取高的 建築的右邊重疊取0
vector<pair<int, int>> h; //根據題意構建的一個數據結構
for(const auto b: buildings){
h.push_back({b[0], -b[2]}); //建築的起點和負高度 目的是利用從小到大的排序特點,起點相同時,先取高的建築
h.push_back({b[1], b[2]}); //建築的終點和高度
}
sort(h.begin(), h.end());
multiset<int> top{0}; //放0進去是因爲當所有建築都沒有時,轉折點是0
vector<vector<int>> res;
int prev = 0, cur = 0;
for(auto x: h){
if(x.second < 0) top.insert(-x.second); //起點的建築高度
else top.erase(top.find(x.second)); //終點的建築高度就直接刪掉
cur = *top.rbegin(); //因爲set是從小到大排序的 所以rbegin是取得最大的
while(cur != prev){
prev = cur;
res.push_back({x.first, cur});
}
}
return res;
}
};