LeetCode 218 天际线问题(扫描线解法)

本题思路,每次遇到一个左边就加入数组,遇到右边就出数组,每次记录当前最大的高度,如果最大高度变化,天际线位置也要随着改变。我没有找到合适的数据结构去记录这一变化,用vector每次修改的复杂度是O(n),肯定会超时,后来看到网上有用到multiset,之前没用过,其实这就是允许有重复元素的set,这样问题就好解决了。

class Solution {
public:
    vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
        vector<vector<int>> ans;
        multiset<pair<int,int> > all;
        for(int i=0;i<buildings.size();i++)
        {
            all.insert(pair<int,int>(buildings[i][0],-buildings[i][2]));
            all.insert(pair<int,int>(buildings[i][1],buildings[i][2]));
        }
        vector<int> tmp={0,0};
        multiset<int> height={0};
        for(auto & t:all)
        {
            if(t.second<0) height.insert(-t.second);
            else height.erase(height.find(t.second));

            auto maxheight = *height.rbegin();

            if(tmp[1]!=maxheight)
            {
                tmp[0]=t.first;
                tmp[1]=maxheight;
                ans.push_back(tmp);
            }
        }
        return ans;
    }
};
posted @ 2020-04-24 11:35  South1999  阅读(191)  评论(0编辑  收藏  举报