The Skyline Problem

题目来源
轮廓线问题,具体解释见这里,解释的特别详细。
然后实际上要注意的是每个建筑的顶上两点,然后注意用负值区分是左端点还是右端点,并且左端点为负,因为当遍历到某个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;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容