The Skyline Problem

To solve this coding challenge, we need to determine the skyline formed by a collection of rectangular buildings. Each building is defined by three parameters: the x-coordinate of its left edge, the x-coordinate of its right edge, and its height. The skyline is visualized as the outer contour when viewed from a distance.

Explanation

Here's how we can approach the problem step-by-step:
  1. Understanding the Problem: The skyline is a series of key points where the height of the skyline changes. A key point
    [x, y]
    represents a point on the skyline at coordinate
    x
    with height
    y
    . The goal is to return these key points in sorted order by
    x
    .
  2. Event Points Concept: We can think of each building contributing two events:
    • A start event when the building begins.
    • An end event when the building ends.
      We'll process these events in sorted order of their x-coordinate values.
  3. Heap Data Structure: To efficiently manage the heights of the buildings we are currently "inside," we can use a max-heap. As we traverse through the event points:
    • On encountering a start event, we add the building's height to the heap.
    • On encountering an end event, we remove the building's height from the heap.
  4. Detecting Key Points: As we add or remove heights, the maximum height in the heap will tell us the current height of the skyline at that x-coordinate. If there's a change in this height from the previous maximum height, it represents a key point.
  5. Edge Cases: Handle scenarios where there are overlapping buildings, and buildings that end/begin at the same x-coordinate.
  6. Detailed Steps in Pseudocode
  7. Initialize Structures:
    • Use a list to store the events.
    • Use a max-heap to keep track of active heights.
    • Track the previous height to detect changes in the skyline.
  8. Create Events: For each building, create two events - one for the start and one for the end and store them in a sorted list.
  9. Process Events:
    • For each event, update the heap and check if there's a change in the maximum height in the heap.
  10. Store Key Points: Whenever there's a change in the maximum height, add this point to the result list.

Pseudocode

                                            
# Input: List of buildings
# Output: List of key points in the skyline

function getSkyline(buildings):
    # Events will store tuples in the form (x-coordinate, event type, height)
    events = []

    # Populate the events list with start and end events for all buildings
    for building in buildings:
        left_x = building[0]
        right_x = building[1]
        height = building[2]
        
        # Start event: Use negative height to differentiate from end event
        events.append((left_x, -height))
        # End event: Use positive height
        events.append((right_x, height))

    # Sort events: By x-coordinate, then by height (start events before end events)
    events.sort()

    # Result list for storing key points of the skyline
    result = []
    
    # Max-heap to keep track of the tallest building at current x-coordinate
    current_heights = [0]
    import heapq

    # Initialize previous maximum height to 0
    previous_max_height = 0

    for event in events:
        x = event[0]
        height = event[1]

        if height < 0: # Start event
            # Add building height to max-heap (negative because heapq is a min-heap)
            heapq.heappush(current_heights, height)
        else: # End event
            # Remove building height from max-heap
            current_heights.remove(-height)
            heapq.heapify(current_heights)

        # Get the current maximum height from the heap (current tallest building)
        current_max_height = -current_heights[0]

        # If there's a change in the maximum height, it means we have a key point
        if current_max_height != previous_max_height:
            result.append([x, current_max_height])
            previous_max_height = current_max_height

    return result

                                        
Summary
  • We've explained how to use event points to represent the start and end of buildings.
  • Use a heap to keep track of the maximum height at any given x-coordinate.
  • Process events in sorted order to construct the skyline incrementally by detecting height changes.
  • Ensure proper handling of corner cases where buildings overlap or have shared edges.
By following these steps, we can efficiently compute the desired skyline for a given set of buildings.