package array; import java.util.ArrayList; import java.util.List; /** * Created by gouthamvidyapradhan on 08/03/2019 * 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. * * 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]] * (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. * * Note: * * schedule and schedule[i] are lists with lengths in range [1, 50]. * 0 <= schedule[i].start < schedule[i].end <= 10^8. * * Solution: O(L X N x N) Where L is the number of schedules, N is the length of schedules for each employee. * Merge all the intervals to form a single merged array, now by using this array form a result array with the intervals * which form the free time. * */ public class EmployeeFreeTime { public static class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } /** * Main method * @param args */ public static void main(String[] args) { List> schedule = new ArrayList<>(); List ints1 = new ArrayList<>(); ints1.add(new Interval(45, 56)); ints1.add(new Interval(89, 96)); List ints3 = new ArrayList<>(); ints3.add(new Interval(5, 21)); ints3.add(new Interval(57, 74)); schedule.add(ints1); schedule.add(ints3); List result = new EmployeeFreeTime().employeeFreeTime(schedule); for(Interval i : result){ System.out.println(i.start + " " + i.end); } } public List employeeFreeTime(List> schedule) { if(schedule.isEmpty()) return new ArrayList<>(); List merged = schedule.get(0); for(int i = 1, l = schedule.size(); i < l; i++){ List employeeInt = schedule.get(i); for(Interval in : employeeInt){ merged = merge(merged, in); } } List result = new ArrayList<>(); for(int i = 0, l = merged.size(); i + 1 < l; i ++){ if(merged.get(i).end != merged.get(i + 1).start){ result.add(new Interval(merged.get(i).end, merged.get(i + 1).start)); } } return result; } private List merge(List list, Interval interval){ List result = new ArrayList<>(); for(int i = 0, l = list.size(); i < l; i ++){ Interval curr = list.get(i); if(interval.start >= curr.start && interval.end <= curr.end){ return list; } else if(interval.start >= curr.start && interval.start <= curr.end){ interval = new Interval(curr.start, interval.end); } else if(interval.end >= curr.start && interval.end <= curr.end){ interval = new Interval(interval.start, curr.end); } else if(interval.end < curr.start){ result.add(interval); for(int j = i; j < l; j++){ result.add(list.get(j)); } return result; } else if(interval.start > curr.end){ result.add(curr); } } result.add(interval); return result; } }