【LeetCode 218.】The Skyline Problem

50 篇文章 0 订阅
4 篇文章 0 订阅

题意:

给出一组矩形的x1, x2, h参数,求出轮廓坐标。

思路:

扫描线算法。
用堆或二叉搜索树维护当前有效的楼的高度,扫描楼的进入和离开端点,如果是进入,而且高度高于已有的楼高度,是一个端点。如果是离开端点,当前高度和第二高度比较,如果当前高度高,记录第二高端点。
注意特殊情况,横坐标相等时按照什么顺序处理。
heap的话需要手写移除函数。
二叉搜索树可以用C++的multiset。

代码:

class Solution {
public:
    vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
        typedef pair<int, int> Event;
        vector<Event> es;
        hs_.clear();
        for (const auto& b: buildings) {
            es.emplace_back(b[0], b[2]);
            es.emplace_back(b[1], -b[2]);
        }
        sort(es.begin(), es.end(), [](const Event& e1, const Event& e2){
            if (e1.first == e2.first) return e1.second > e2.second;
            else return e1.first < e2.first;
        });
        vector<vector<int>> ans;
        
        for (const auto& e: es) {
            int x = e.first;
            int h = abs(e.second);
            
            bool entering = e.second > 0;
            if (entering) {
                if (h > this->maxHeight()) {
                    ans.push_back({x, h});
                }
                hs_.insert(h);
            }else {
                hs_.erase(hs_.equal_range(h).first);
                if (h > this->maxHeight()) {
                    ans.push_back({x, this->maxHeight()});
                }
            }
        }
        return ans;
    }
    
private:
    multiset<int> hs_;
    int maxHeight() const {
        if (hs_.empty()) return 0;
        else return *hs_.rbegin();
    }
};

参考链接:

http://zxi.mytechroad.com/blog/tree/leetcode-218-the-skyline-problem/

一周前的旷视面试就遇见的这个题。。。
如果我…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值