题目来源
轮廓线问题,具体解释见这里,解释的特别详细。
然后实际上要注意的是每个建筑的顶上两点,然后注意用负值区分是左端点还是右端点,并且左端点为负,因为当遍历到某个x值,有一个矩形的右端点及另一个的左端点,这时候需要先考虑左端点。然后所有的端点按照x值大小排序,当遍历到某点的时候,会影响这个点的只有某部分,所以不用考虑所有点。
代码如下:
class Solution {
public:
vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) {
vector<pair<int, int>> res;
multiset<pair<int, int>> seq;
pair<int, int> cur{0, 0};
for (auto point : buildings) {
seq.emplace(make_pair(point[0], -point[2]));
seq.emplace(make_pair(point[1], point[2]));
}
multiset<int> heights{0};
for (auto point : seq) {
if (point.second < 0)
heights.emplace(-point.second);
else
heights.erase(heights.find(point.second));
if (*heights.rbegin() != cur.second) {
cur.first = point.first;
cur.second = *heights.rbegin();
res.push_back(cur);
}
}
return res;
}
};