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.
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.
1 2 3 4 5 6 7 8 910111213141516171819202122232425
"""# Definition for an Interval.class Interval: def __init__(self, start: int = None, end: int = None): self.start = start self.end = end"""classSolution:defemployeeFreeTime(self,schedule:"[[Interval]]")->"[Interval]":intervals=[]foreinschedule:intervals.extend(e)intervals.sort(key=lambdax:(x.start,x.end))merged=[intervals[0]]forxinintervals[1:]:ifmerged[-1].end<x.start:merged.append(x)else:merged[-1].end=max(merged[-1].end,x.end)ans=[]fora,binpairwise(merged):ans.append(Interval(a.end,b.start))returnans
/*// Definition for an Interval.class Interval { public int start; public int end; public Interval() {} public Interval(int _start, int _end) { start = _start; end = _end; }};*/classSolution{publicList<Interval>employeeFreeTime(List<List<Interval>>schedule){List<Interval>intervals=newArrayList<>();for(List<Interval>e:schedule){intervals.addAll(e);}intervals.sort((a,b)->a.start==b.start?a.end-b.end:a.start-b.start);List<Interval>merged=newArrayList<>();merged.add(intervals.get(0));for(inti=1;i<intervals.size();++i){Intervallast=merged.get(merged.size()-1);Intervalcur=intervals.get(i);if(last.end<cur.start){merged.add(cur);}else{last.end=Math.max(last.end,cur.end);}}List<Interval>ans=newArrayList<>();for(inti=1;i<merged.size();++i){Intervala=merged.get(i-1);Intervalb=merged.get(i);ans.add(newInterval(a.end,b.start));}returnans;}}
/*// Definition for an Interval.class Interval {public: int start; int end; Interval() {} Interval(int _start, int _end) { start = _start; end = _end; }};*/classSolution{public:vector<Interval>employeeFreeTime(vector<vector<Interval>>schedule){vector<Interval>intervals;for(auto&e:schedule){intervals.insert(intervals.end(),e.begin(),e.end());}sort(intervals.begin(),intervals.end(),[](constInterval&a,constInterval&b){if(a.start==b.start)returna.end<b.end;returna.start<b.start;});vector<Interval>merged;merged.push_back(intervals[0]);for(inti=1;i<intervals.size();++i){auto&last=merged.back();auto&cur=intervals[i];if(last.end<cur.start){merged.push_back(cur);}else{last.end=max(last.end,cur.end);}}vector<Interval>ans;for(inti=1;i<merged.size();++i){auto&a=merged[i-1];auto&b=merged[i];ans.emplace_back(a.end,b.start);}returnans;}};
/** * Definition for an Interval. * type Interval struct { * Start int * End int * } */funcemployeeFreeTime(schedule[][]*Interval)[]*Interval{varintervals[]*Intervalfor_,e:=rangeschedule{intervals=append(intervals,e...)}sort.Slice(intervals,func(i,jint)bool{ifintervals[i].Start==intervals[j].Start{returnintervals[i].End<intervals[j].End}returnintervals[i].Start<intervals[j].Start})merged:=[]*Interval{intervals[0]}for_,cur:=rangeintervals[1:]{last:=merged[len(merged)-1]iflast.End<cur.Start{merged=append(merged,cur)}elseifcur.End>last.End{last.End=cur.End}}varans[]*Intervalfori:=1;i<len(merged);i++{a,b:=merged[i-1],merged[i]ans=append(ans,&Interval{Start:a.End,End:b.Start})}returnans}