leetcode218 - The Skyline Problem - hard
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 aregiven the locations and height of all the buildingsas shown on a cityscape photo (Figure A), write a program tooutput the skylineformed by these buildings collectively (Figure B).
The geometric information of each building is represented by a triplet of integers[Li, Ri, Hi]
, whereLi
andRi
are the x coordinates of the left and right edge of the ith building, respectively, andHi
is its height. It is guaranteed that0 ≤ Li, Ri ≤ INT_MAX
,0 < Hi ≤ INT_MAX
, andRi - Li > 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], ... ]
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], ...]
class Solution { public: vector<vector<int>> getSkyline(vector<vector<int>>& buildings) { vector<vector<int>> res; vector<pair<int,int>> pts; for (auto b : buildings){ pts.emplace_back(b[0], -b[2]); //entering point pts.emplace_back(b[1], b[2]); //leaving point } sort(pts.begin(), pts.end());
multiset<int> ms; ms.insert(0); int maxHeight = 0; for (auto p : pts){ if (p.second < 0) ms.insert(-p.second); else ms.erase(ms.find(p.second)); int curMaxHeight = *ms.rbegin(); if (curMaxHeight != maxHeight){ res.push_back({p.first, curMaxHeight}); maxHeight = curMaxHeight; } } return res; } };