KK's blog

每天积累多一些

0%

LeetCode 759 Employee Free Time

LeetCode



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

题目大意:

给定员工的schedule,给所有员工的空余时间的区间

解题思路:

一开始考虑用Leetcode 056 merge intervals,然后求不能merge时的区间。后来想用Leetcode 253 meeting rooms II也是关于重合区间,只要active meetings为0时,就表示空余区间,此法更容易实现

解题步骤:

N/A

注意事项:

  1. 用Leetcode 253 meeting rooms II的排序解法
  2. 注意输入是每一个员工的schedule如[Interval(1, 2), Interval(5, 6)],然后是所有员工schedule的列表

Python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def test(self):
TestCases.compare(self, self.employeeFreeTime([[Interval(1, 2), Interval(5, 6)], [Interval(1, 3)], [Interval(4, 10)]]), [Interval(3, 4)])

def employeeFreeTime(self, schedule: [[Interval]]) -> [Interval]:
schedule_endpoints = []
for li in schedule:
for s in li:
schedule_endpoints.append((s.start, 0)) # [(1, 0),(2,1),(5,0), (6,1)]
schedule_endpoints.append((s.end, 1))
schedule_endpoints.sort()
res, free_time, active_schedule = [], [], 0
for i in range(len(schedule_endpoints)):
if schedule_endpoints[i][1] == 0:
active_schedule += 1 # 0
else:
active_schedule -= 1 #
if active_schedule == 0:
free_time.append(schedule_endpoints[i][0]) #[2,5]
if active_schedule == 1 and len(free_time) == 1:
free_time.append(schedule_endpoints[i][0])
free_interval = Interval(free_time[0], free_time[1])
res.append(free_interval)
free_time = []
return res

算法分析:

时间复杂度为O(nlogn),空间复杂度O(n)

Free mock interview