LeetCode 0759. Employee Free Time Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0759. Employee Free Time

Description

We are given a list schedule of employees, which represents the working time for each employee.

Each employee has a list of non-overlapping Intervals, and these intervals are in sorted order.

Return the list of finite intervals representing common, positive-length free time for all employees, also in sorted order.

(Even though we are representing Intervals in the form [x, y], the objects inside are Intervals, not lists or arrays. For example, schedule[0][0].start = 1, schedule[0][0].end = 2, and schedule[0][0][0] is not defined).  Also, we wouldn't include intervals like [5, 5] in our answer, as they have zero length.

 

Example 1:

Input: schedule = [[[1,2],[5,6]],[[1,3]],[[4,10]]]
Output: [[3,4]]
Explanation: There are a total of three employees, and all common
free time intervals would be [-inf, 1], [3, 4], [10, inf].
We discard any intervals that contain inf as they aren't finite.

Example 2:

Input: schedule = [[[1,3],[6,7]],[[2,4]],[[2,5],[9,12]]]
Output: [[5,6],[7,9]]

 

Constraints:

  • 1 <= schedule.length , schedule[i].length <= 50
  • 0 <= schedule[i].start < schedule[i].end <= 10^8

Solutions

Solution 1: Interval Merging

We can merge all employees' working time intervals into a single list, then sort and merge the overlapping intervals. Finally, we traverse the merged interval list to find the free time periods between adjacent intervals.

The time complexity is O(mn log(mn)) and the space complexity is O(mn), where m is the number of employees and n is the number of working intervals per employee.

PythonJavaC++GoTypeScript
""" # Definition for an Interval. class Interval: def __init__(self, start: int = None, end: int = None): self.start = start self.end = end """ class Solution: def employeeFreeTime(self, schedule: "[[Interval]]") -> "[Interval]": intervals = [] for e in schedule: intervals.extend(e) intervals.sort(key=lambda x: (x.start, x.end)) merged = [intervals[0]] for x in intervals[1:]: if merged[-1].end < x.start: merged.append(x) else: merged[-1].end = max(merged[-1].end, x.end) ans = [] for a, b in pairwise(merged): ans.append(Interval(a.end, b.start)) return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !