题意理解
第一象限有一组矩形框,相互可能重叠,求它的轮廓。
轮廓的定义:水平线段的左端点。
问题分析
图的问题通用的方法是扫描线。问题转化为,在遍历扫描线过程中查找关键点,决定轮廓。
分开始线,结束线处理,使用一个平衡搜索树(高度表)保存遍历过程中遇到的有效高度
从左至右依次遍历所有扫描线。
对于开始线,如果高度大于所有有效高度,是关键点。同时也是新的有效高度。
对于结束线,此高度失效,从高度表中删除此高度。如果删除的高度比剩余的高度都大,说明露出的新的最大高度也是关键点。
其他
链接
参考 https://www.youtube.com/watch?v=8Kd-Tn_Rz7s
private:
multiset<int> heightSet; //保存高度集合(平衡搜索树)
int max_height() { //计算最高高度
if (heightSet.empty()) {
return 0;
}
return *heightSet.rbegin(); //(最后一个元素是最大元素)
}
public:
vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {
vector<vector<int>>