218. 天際線問題

題目: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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章