logo
Problems

The Skyline problem

Problem

Given N buildings in a x-axis, each building is a rectangle and can be represented by a triple (start, end, height), where start is the start position on x-axis, end is the end position on x-axis and height is the height of the building. Buildings may overlap if you see them from far away, find the outline of them。

An outline can be represented by a triple, (start, end, height), where start is the start position on x-axis of the outline, end is the end position on x-axis and height is the height of the outline.

Note: Please merge the adjacent outlines if they have the same height and make sure different outlines cant overlap on x-axis.

Example

Given 3 buildings:

[
  [1, 3, 3],
  [2, 4, 4],
  [5, 6, 1]
]

The outlines are:

[
  [1, 2, 3],
  [2, 4, 4],
  [5, 6, 1]
]

Solution

From the input, create tuples (x, height, isStart), so each building will create 2 tuples, one for start point and one for end point. Sort the tuples by x, then for each tuple:

  • if start:
    • if height higher than previous height, a new segment! Add to the result and push the height to the heap
    • otherwise just push the height to the heap.
  • else end:
    • if height lower than the highest height from the heap, just delete it(or mark it as deleted)
    • else a new segment! Add to the result and pop from the heap.

Note: during sorting, for the same x, end point should be prior to the start point to prevent multiple segments at the same height.

Online Judge