Notes:
总得思路是:左右节点+multiset
首先,将所有的buildings分为左右节点(左x坐标,高)和(右x坐标,高)分别存储到vector<pair<int,int>>
的结构中。这里为了将左右分开处理,做节点的高用负数表示。
然后,将节点坐标按x坐标排序。
之后,循环遍历节点vector,将节点的高插入到multiset中,并判断之前的高是否与当前一样,若不一样则保存当前高度和x坐标。
思路借鉴了Eason Liu的技术博客,这里表示感谢!
class Solution {
public:
vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) {
int i,j,pre,cur;
vector<pair<int,int> > re,height;
multiset<int> heap;
for(i = 0; i < buildings.size(); i++)
{
height.push_back(pair<int,int>(buildings[i][0],-buildings[i][2]));
height.push_back(pair<int,int>(buildings[i][1], buildings[i][2]));
}
sort(height.begin(),height.end());
heap.insert(0);
pre = 0; cur = 0;
for(i = 0; i < height.size(); i++)
{
if(height[i].second < 0)
heap.insert(-height[i].second);
else
heap.erase(heap.find(height[i].second));
cur = *heap.rbegin();//multiset中最后一个元素,height的最大值
if(cur != pre)
{
re.push_back(pair<int,int>(height[i].first,cur));
pre = cur;
}
}
return re;
}
};
Leetcode 218 The Skyline Problem
原文地址:http://blog.csdn.net/jeanphorn/article/details/46638289