本题思路,每次遇到一个左边就加入数组,遇到右边就出数组,每次记录当前最大的高度,如果最大高度变化,天际线位置也要随着改变。我没有找到合适的数据结构去记录这一变化,用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;
}
};