题意:
给出一组矩形的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/
一周前的旷视面试就遇见的这个题。。。
如果我…