Intervals
Employee Free Time
DESCRIPTION (inspired by Leetcode.com)
Write a function to find the common free time for all employees from a list called schedule. Each employee's schedule is a list of non-overlapping intervals, sorted by start time, representing the times that employee is busy (their meetings). The function should return the finite, non-zero length intervals during which every employee is free, sorted in order. Free time is the gaps that sit between busy periods once all the schedules are combined. There's no fixed workday here, so time before everyone's first meeting or after everyone's last doesn't count — that's what "finite" means.
Input:
schedule = [[[2,4],[7,10]],[[1,5]],[[6,9]]]
Output:
[[5,6]]
Explanation: The three employees collectively have only one common free time interval, which is from 5 to 6.
Explanation
- Time before the earliest busy interval (e.g., if the first meeting starts at 9:00 AM, we don't count 8:00-9:00 AM as "free time")
- Time after the latest busy interval (e.g., if the last meeting ends at 5:00 PM, we don't count 5:00-6:00 PM as "free time")
Phase 1
def employeeFreeTime(schedule):flattened = [i for employee in schedule for i in employee]intervals = sorted(flattened, key=lambda x: x[0])merged = []for interval in intervals:if not merged or merged[-1][1] < interval[0]:merged.append(interval)else:merged[-1][1] = max(merged[-1][1], interval[1])free_times = []for i in range(1, len(merged)):start = merged[i-1][1]end = merged[i][0]free_times.append([start, end])return free_times
employee free time
0 / 1
Phase 2
def employeeFreeTime(schedule):flattened = [i for employee in schedule for i in employee]intervals = sorted(flattened, key=lambda x: x[0])merged = []for interval in intervals:if not merged or merged[-1][1] < interval[0]:merged.append(interval)else:merged[-1][1] = max(merged[-1][1], interval[1])free_times = []for i in range(1, len(merged)):start = merged[i-1][1]end = merged[i][0]free_times.append([start, end])return free_times
merge intervals
0 / 8
Phase 3
def employeeFreeTime(schedule):flattened = [i for employee in schedule for i in employee]intervals = sorted(flattened, key=lambda x: x[0])merged = []for interval in intervals:if not merged or merged[-1][1] < interval[0]:merged.append(interval)else:merged[-1][1] = max(merged[-1][1], interval[1])free_times = []for i in range(1, len(merged)):start = merged[i-1][1]end = merged[i][0]free_times.append([start, end])return free_times
merge
0 / 4
Test Your Knowledge
Login to take the complexity quiz and track your progress
Complexity Analysis
Time Complexity: O(n log n) where n is the number of intervals. The time complexity is dominated by the sorting step.
Space Complexity: O(n) where n is the number of intervals. We need space for the free_times output array.
Solution
def employeeFreeTime(schedule):flattened = [i for employee in schedule for i in employee]intervals = sorted(flattened, key=lambda x: x[0])merged = []for interval in intervals:if not merged or merged[-1][1] < interval[0]:merged.append(interval)else:merged[-1][1] = max(merged[-1][1], interval[1])free_times = []for i in range(1, len(merged)):start = merged[i-1][1]end = merged[i][0]free_times.append([start, end])return free_times
employee free time
0 / 14
Your account is free and you can post anonymously if you choose.