Formatted question description: https://leetcode.ca/all/759.html

759. Employee Free Time

Level

Hard

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

Solution

First, use a list to store all the intervals in schedule, and merge the overlapping intervals. This is done by first sorting the intervals in the list according to the start points in ascending order, then update the current interval’s end time once an overlapping interval is met, and add the merged intervals to a new list.

Next, loop over the new list that contains merged intervals, which are sorted. For each pair of adjacent intervals, use the first interval’s end time and the second interval’s start time to create an interval of free time and add the free time interval to the result list. Finally, return the result list.

/*
// Definition for an Interval.
class Interval {
    public int start;
    public int end;

    public Interval() {}

    public Interval(int _start, int _end) {
        start = _start;
        end = _end;
    }
};
*/
class Solution {
    public List<Interval> employeeFreeTime(List<List<Interval>> schedule) {
        List<Interval> allSchedules = new ArrayList<Interval>();
        for (List<Interval> list : schedule)
            allSchedules.addAll(list);
        Collections.sort(allSchedules, new Comparator<Interval>() {
            public int compare(Interval interval1, Interval interval2) {
                if (interval1.start != interval2.start)
                    return interval1.start - interval2.start;
                else
                    return interval1.end - interval2.end;
            }
        });
        List<Interval> sorted = new ArrayList<Interval>();
        Interval interval0 = allSchedules.get(0);
        int curStart = interval0.start, curEnd = interval0.end;
        int size = allSchedules.size();
        for (int i = 1; i < size; i++) {
            Interval interval = allSchedules.get(i);
            if (interval.start <= curEnd)
                curEnd = Math.max(curEnd, interval.end);
            else {
                sorted.add(new Interval(curStart, curEnd));
                curStart = interval.start;
                curEnd = interval.end;
            }
        }
        sorted.add(new Interval(curStart, curEnd));
        List<Interval> freeTimeList = new ArrayList<Interval>();
        int sortedSize = sorted.size();
        for (int i = 1; i < sortedSize; i++)
            freeTimeList.add(new Interval(sorted.get(i - 1).end, sorted.get(i).start));
        return freeTimeList;
    }
}

All Problems

All Solutions