@@ -68,32 +68,237 @@ tags:
6868
6969<!--  solution:start --> 
7070
71- ### 方法一  
71+ ### 方法一:区间合并  
72+ 
73+ 我们可以将所有员工的工作时间区间合并成一个列表,然后对该列表进行排序并合并重叠的区间。最后,遍历合并后的区间列表,找出相邻区间之间的空闲时间段。
74+ 
75+ 时间复杂度 $O(m \times n \times \log(m \times n))$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为员工数量和每个员工的工作时间区间数量。
7276
7377<!--  tabs:start --> 
7478
7579#### Python3  
7680
7781``` python 
78- 
82+ """ 
83+ # Definition for an Interval. 
84+ class Interval: 
85+     def __init__(self, start: int = None, end: int = None): 
86+         self.start = start 
87+         self.end = end 
88+ """ 
89+ 
90+ 
91+ class  Solution :
92+     def  employeeFreeTime (self  , schedule : " [[Interval]]"  ) -> " [Interval]"  :
93+         intervals =  []
94+         for  e in  schedule:
95+             intervals.extend(e)
96+         intervals.sort(key = lambda  x : (x.start, x.end))
97+         merged =  [intervals[0 ]]
98+         for  x in  intervals[1 :]:
99+             if  merged[- 1 ].end <  x.start:
100+                 merged.append(x)
101+             else :
102+                 merged[- 1 ].end =  max (merged[- 1 ].end, x.end)
103+         ans =  []
104+         for  a, b in  pairwise(merged):
105+             ans.append(Interval(a.end, b.start))
106+         return  ans
79107``` 
80108
81109#### Java  
82110
83111``` java 
84- 
112+ /* 
113+ // Definition for an Interval. 
114+ class Interval { 
115+     public int start; 
116+     public int end; 
117+ 
118+     public Interval() {} 
119+ 
120+     public Interval(int _start, int _end) { 
121+         start = _start; 
122+         end = _end; 
123+     } 
124+ }; 
125+ */ 
126+ 
127+ class  Solution  {
128+     public  List<Interval >  employeeFreeTime (List<List<Interval > >  schedule ) {
129+         List<Interval >  intervals =  new  ArrayList<> ();
130+         for  (List<Interval >  e :  schedule) {
131+             intervals. addAll(e);
132+         }
133+ 
134+         intervals. sort((a, b) - >  a. start ==  b. start ?  a. end -  b. end :  a. start -  b. start);
135+ 
136+         List<Interval >  merged =  new  ArrayList<> ();
137+         merged. add(intervals. get(0 ));
138+         for  (int  i =  1 ; i <  intervals. size(); ++ i) {
139+             Interval  last =  merged. get(merged. size() -  1 );
140+             Interval  cur =  intervals. get(i);
141+             if  (last. end <  cur. start) {
142+                 merged. add(cur);
143+             } else  {
144+                 last. end =  Math . max(last. end, cur. end);
145+             }
146+         }
147+ 
148+         List<Interval >  ans =  new  ArrayList<> ();
149+         for  (int  i =  1 ; i <  merged. size(); ++ i) {
150+             Interval  a =  merged. get(i -  1 );
151+             Interval  b =  merged. get(i);
152+             ans. add(new  Interval (a. end, b. start));
153+         }
154+ 
155+         return  ans;
156+     }
157+ }
85158``` 
86159
87160#### C++  
88161
89162``` cpp 
90- 
163+ /* 
164+ // Definition for an Interval. 
165+ class Interval { 
166+ public: 
167+     int start; 
168+     int end; 
169+ 
170+     Interval() {} 
171+ 
172+     Interval(int _start, int _end) { 
173+         start = _start; 
174+         end = _end; 
175+     } 
176+ }; 
177+ */ 
178+ 
179+ class  Solution  {
180+ public:
181+     vector<Interval > employeeFreeTime(vector<vector<Interval >> schedule) {
182+         vector<Interval > intervals;
183+         for (auto& e : schedule) {
184+             intervals.insert(intervals.end(), e.begin(), e.end());
185+         }
186+ 
187+         sort(intervals.begin(), intervals.end(), [](const Interval& a, const Interval& b) { 
188+             if (a.start == b.start) return a.end < b.end; 
189+             return a.start < b.start; 
190+         }); 
191+ 
192+         vector<Interval> merged; 
193+         merged.push_back(intervals[0]); 
194+         for (int i = 1; i < intervals.size(); ++i) { 
195+             auto& last = merged.back(); 
196+             auto& cur = intervals[i]; 
197+             if (last.end < cur.start) { 
198+                 merged.push_back(cur); 
199+             } else { 
200+                 last.end = max(last.end, cur.end); 
201+             } 
202+         }
203+ 
204+         vector<Interval> ans;
205+         for  (int  i = 1 ; i < merged.size(); ++i) {
206+             auto& a = merged[i - 1]; 
207+             auto& b = merged[i]; 
208+             ans.emplace_back(a.end, b.start); 
209+         } 
210+ 
211+         return ans; 
212+     } 
213+ };
91214``` 
92215
93216#### Go  
94217
95218``` go 
219+ /* *
220+  * Definition for an Interval. 
221+  * type Interval struct { 
222+  *     Start int 
223+  *     End   int 
224+  * } 
225+  */  
226+ 
227+ func  employeeFreeTime (schedule  [][]*Interval ) []*Interval  {
228+ 	var  intervals  []*Interval
229+ 	for  _ , e  :=  range  schedule {
230+ 		intervals = append (intervals, e...)
231+ 	}
232+ 
233+ 	sort.Slice (intervals, func (i, j int ) bool  {
234+ 		if  intervals[i].Start  == intervals[j].Start  {
235+ 			return  intervals[i].End  < intervals[j].End 
236+ 		}
237+ 		return  intervals[i].Start  < intervals[j].Start 
238+ 	})
239+ 
240+ 	merged  :=  []*Interval{intervals[0 ]}
241+ 	for  _ , cur  :=  range  intervals[1 :] {
242+ 		last  :=  merged[len (merged)-1 ]
243+ 		if  last.End  < cur.Start  {
244+ 			merged = append (merged, cur)
245+ 		} else  if  cur.End  > last.End  {
246+ 			last.End  = cur.End 
247+ 		}
248+ 	}
249+ 
250+ 	var  ans  []*Interval
251+ 	for  i  :=  1 ; i < len (merged); i++ {
252+ 		a , b  :=  merged[i-1 ], merged[i]
253+ 		ans = append (ans, &Interval{Start: a.End , End: b.Start })
254+ 	}
255+ 
256+ 	return  ans
257+ }
258+ ``` 
96259
260+ #### TypeScript  
261+ 
262+ ``` ts 
263+ /** 
264+  * // Definition for an Interval. 
265+  * class Interval { 
266+  *    start: number; 
267+  *    end: number; 
268+  *    constructor(start: number, end: number) { 
269+  *        this.start = start; 
270+  *        this.end = end; 
271+  *    } 
272+  * } 
273+  */  
274+ function  employeeFreeTime(schedule :  Interval [][]):  Interval [] {
275+     const   intervals:  Interval [] =  [];
276+     for  (const   e of  schedule ) {
277+         intervals .push (... e );
278+     }
279+ 
280+     intervals .sort ((a , b ) =>  (a .start  ===  b .start  ?  a .end  -  b .end  :  a .start  -  b .start ));
281+ 
282+     const   merged:  Interval [] =  [intervals [0 ]];
283+     for  (let  i =  1 ; i  <  intervals .length ; ++ i ) {
284+         const   last =  merged [merged .length  -  1 ];
285+         const   cur =  intervals [i ];
286+         if  (last .end  <  cur .start ) {
287+             merged .push (cur );
288+         } else  {
289+             last .end  =  Math .max (last .end , cur .end );
290+         }
291+     }
292+ 
293+     const   ans:  Interval [] =  [];
294+     for  (let  i =  1 ; i  <  merged .length ; ++ i ) {
295+         const   a =  merged [i  -  1 ];
296+         const   b =  merged [i ];
297+         ans .push (new  Interval (a .end , b .start ));
298+     }
299+ 
300+     return  ans ;
301+ }
97302``` 
98303
99304<!--  tabs:end --> 
0 commit comments