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: From Buildings to Key PointsInput: Buildings[2,9,10][3,7,15][5,12,12]Output: Skyline[2,10][3,15][7,12][9,12][12,0]Key points mark where skyline height changes
Understanding the Visualization
1
Input Buildings
Buildings as [left, right, height] rectangles
2
Find Key Points
Identify where skyline height changes
3
Output Skyline
List of [x, height] key points
Key Takeaway
🎯 Key Insight: The skyline only changes at building start/end points, so we can use a sweep line algorithm to efficiently process these critical events.
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