您的位置:首页 > 其它

LeetCode-218. The Skyline Problem

2018-03-17 16:19 330 查看

LeetCode-218. The Skyline Problem

A city's skyline is the outer contour of the silhouette formed by all the buildings in that city when viewed from a distance. Now suppose you are given the locations and height of all the buildings as shown on a cityscape photo (Figure A), write a program to output the skyline formed by these buildings collectively (Figure B).


 


The geometric information of each building is represented by a triplet of integers 
[Li, Ri, Hi]
, where 
Li
 and 
Ri
 are the x coordinates of the left and right edge of the ith building, respectively, and 
Hi
 is its height. It is guaranteed that 
0 ≤ Li, Ri ≤ INT_MAX
0 < Hi ≤ INT_MAX
, and 
Ri - Li > 0
. You may assume all buildings are perfect rectangles grounded on an absolutely flat surface at height 0.For instance, the dimensions of all buildings in Figure A are recorded as: 
[ [2 9 10], [3 7 15], [5 12 12], [15 20 10], [19 24 8] ] 
.The output is a list of "key points" (red dots in Figure B) in the format of 
[ [x1,y1], [x2, y2], [x3, y3], ... ]
 that uniquely defines a skyline. A key point is the left endpoint of a horizontal line segment. Note that the last key point, where the rightmost building ends, is merely used to mark the termination of the skyline, and always has zero height. Also, the ground in between any two adjacent buildings should be considered part of the skyline contour.For instance, the skyline in Figure B should be represented as:
[ [2 10], [3 15], [7 12], [12 0], [15 10], [20 8], [24, 0] ]
.Notes:The number of buildings in any input list is guaranteed to be in the range 
[0, 10000]
.
The input list is already sorted in ascending order by the left x position 
Li
.
The output list must be sorted by the x position.

There must be no consecutive horizontal lines of equal height in the output skyline. For instance, 
[...[2 3], [4 5], [7 5], [11 5], [12 7]...]
 is not acceptable; the three lines of height 5 should be merged into one in the final output as such: 
[...[2 3], [4 5], [12 7], ...]

解题思路:求解此题有一个非常巧妙的方法, 就是将每个建筑物的起点连同高度与终点连同高度各作为一个pair都统一保存到一个multiset<pair<int, int>> 进行排序, 为区分起点和终点,将起点的高度设为负值, 将起点高度设为负值还有一个好处就是如果有另外一个终点和起点在同一个位置同一个高度, 排序之后会起点会在前面, 也就是在同一个位置有一个起点和终点会先处理起点. 然后在处理这个终点, 如果是起点, 就将其高度放到multiset中, 如果是终点就将其高度值在高度值集合中删除. 然后再看添加和或者删除前后的multiset中最大值是否发生改变, 如果发生改变了说明这个点是边际点, 另外删除multiset的时候不可以直接删除值, 因为这样会把所有等于这个值的点都删除, 我们要先利用find找到第一个这个值的指针, 然后删除这个指针, 这样可以保证只删除一个.class Solution {
public:
vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) {
if (buildings.size() == 0) return {};
multiset<pair<int, int>> st;
vector<pair<int, int>> ans;
for (auto val : buildings)
{
st.insert(make_pair(val[0], -val[2]));
st.insert(make_pair(val[1], val[2]));
}
multiset<int> height{ 0 };
int Max = 0;
for (auto val : st)
{
if (val.second < 0) height.insert(-val.second);
else height.erase(height.find(val.second));
if ((*height.rbegin()) != Max)
ans.push_back(make_pair(val.first, *height.rbegin()));
Max = *height.rbegin();
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: