@@ -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