Search lands in PR-5.1 (Pagefind).

How-to Intermediate

Chapter 2 Updated

Employee Free Time

Flatten, merge, then gaps between merged = free time.

  • Full 6m
  • Revision 2m
  • Flow 1m

Problem Statement

Given the work schedules of all employees (a list of lists of intervals), find the common free time across all employees — the gaps in which nobody is working.

Input

A list of schedules, one per employee. Each employee’s schedule is a list of non-overlapping busy intervals.

Example input
schedule = [[[1,2],[5,6]], [[1,3]], [[4,10]]]

Output

The list of free intervals — gaps where no employee is working — returned in sorted order.

Expected output
[[3,4]]

Constraints

  • 1 ≤ schedule.length ≤ 50 (employees)
  • 1 ≤ schedule[i].length ≤ 50 (intervals per employee)
  • 0 ≤ schedule[i][j].start < schedule[i][j].end ≤ 10⁸
  • Each employee’s intervals are pairwise disjoint and sorted.

Intuition

This problem reduces to “Merge Intervals” + “find the gaps.” Flatten every schedule into one big list → sort by start → merge overlapping intervals → the gaps between consecutive merged intervals are the common free time.

Walkthrough
Input schedules:
  A: [1,2]      [5,6]
  B: [1,3]
  C:            [4,10]
 
Flatten + sort:  [1,2] [1,3] [4,10] [5,6]
Merge:           [1,3]  [4,10]          ← [5,6] swallowed by [4,10]
Gaps:                ^^^
                     [3,4]   ← common free time

Solution

employee_free_time.py
def employeeFreeTime(schedule):
    # Flatten all intervals
    all_intervals = []
    for employee in schedule:
        all_intervals.extend(employee)
 
    all_intervals.sort(key=lambda x: x[0])
 
    # Merge
    merged = [all_intervals[0]]
    for interval in all_intervals[1:]:
        if interval[0] <= merged[-1][1]:
            merged[-1][1] = max(merged[-1][1], interval[1])
        else:
            merged.append(interval)
 
    # Gaps = free time
    free = []
    for i in range(1, len(merged)):
        free.append([merged[i-1][1], merged[i][0]])
 
    return free

Complexity

MetricValueReason
TimeO(N log N)N = total intervals across all employees
SpaceO(N)Flattened and merged arrays

Edge Case Thinking

ScenarioHandling
Single employeeTheir gaps are the free time — though “common” free time across ALL employees is ill-defined for one person; depends on problem semantics.
Everyone busy continuouslymerged collapses to one block → no gaps → return [].
Identical schedules across employeesDuplicates merge cleanly; same output as a single copy.
Follow-up: schedules pre-sorted per employeeMerge with a min-heap to get O(N log K) where K = employee count.

Comments

Comments are disabled in this environment. Set PUBLIC_GISCUS_REPO, PUBLIC_GISCUS_REPO_ID, and PUBLIC_GISCUS_CATEGORY_ID to enable.