A city's skyline is the outer contour of the silhouette formed by all the buildings in that city when viewed from a distance. Given the locations and heights of all the buildings, return the skyline formed by these buildings collectively.

The geometric information of each building is given in the array buildings where buildings[i] = [left_i, right_i, height_i]:

  • left_i is the x coordinate of the left edge of the ith building.
  • right_i is the x coordinate of the right edge of the ith building.
  • height_i is the height of the ith building.

You may assume all buildings are perfect rectangles grounded on an absolutely flat surface at height 0.

The skyline should be represented as a list of "key points" sorted by their x-coordinate in the form [[x1,y1],[x2,y2],...]. Each key point is the left endpoint of some horizontal segment in the skyline except the last point in the list, which always has a y-coordinate 0 and is used to mark the skyline's termination where the rightmost building ends. Any ground between the leftmost and rightmost buildings should be part of the skyline's contour.

Note: 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],...]

Input & Output

Example 1 — Overlapping Buildings
$ Input: buildings = [[2,9,10],[3,7,15],[5,12,12]]
Output: [[2,10],[3,15],[7,12],[9,12],[12,0]]
💡 Note: At x=2: building 1 starts (height 10). At x=3: building 2 starts (height 15, new max). At x=7: building 2 ends (height drops to 12 from building 3). At x=9: building 1 ends (height stays 12). At x=12: building 3 ends (height drops to 0).
Example 2 — Adjacent Buildings
$ Input: buildings = [[0,2,3],[2,5,3]]
Output: [[0,3],[5,0]]
💡 Note: Two adjacent buildings with same height merge into one continuous skyline segment from x=0 to x=5.
Example 3 — Single Building
$ Input: buildings = [[1,3,2]]
Output: [[1,2],[3,0]]
💡 Note: Simple case: building starts at x=1 with height 2, ends at x=3 returning to ground level 0.

Constraints

  • 1 ≤ buildings.length ≤ 104
  • 0 ≤ lefti < righti ≤ 231 - 1
  • 1 ≤ heighti ≤ 231 - 1
  • buildings is sorted by lefti in non-decreasing order

Visualization

Tap to expand
The Skyline Problem INPUT h=10 h=15 h=12 2 5 7 9 12 Buildings Array: [2, 9, 10] [3, 7, 15] [5, 12, 12] [left, right, height] 3 overlapping buildings ALGORITHM STEPS 1 Create Events Start(neg h), End(pos h) (2,-10)(3,-15)(5,-12) (7,15)(9,10)(12,12) 2 Sort Events by X Process left-to-right 3 Max Heap Tracking Track active heights Max Heap Operations: Start: Add height to heap End: Remove from heap Track max height changes 4 Record Key Points When max height changes x=2: max 0-->10 [2,10] x=3: max 10-->15 [3,15] FINAL RESULT [2,10] [3,15] [7,12] [9,12] [12,0] Output Skyline: [[2,10],[3,15],[7,12], [9,12],[12,0]] OK - 5 Key Points Skyline contour complete Key Insight: Use a Max Heap to efficiently track the maximum height among all active buildings at each position. Process building events (starts/ends) sorted by x-coordinate. A key point is recorded whenever the maximum height changes. Time Complexity: O(n log n) for sorting and heap operations. TutorialsPoint - The Skyline Problem | Optimal Solution (Max Heap + Event Processing)
Asked in
Google 45 Facebook 38 Amazon 32 Microsoft 28 Uber 22
89.0K Views
Medium-High Frequency
~35 min Avg. Time
2.8K Likes
Ln 1, Col 1
Smart Actions
💡 Explanation
AI Ready
💡 Suggestion Tab to accept Esc to dismiss
// Output will appear here after running code
Code Editor Closed
Click the red button to reopen