1229. 安排会议日程
大约 2 分钟
1229. 安排会议日程
- 标签:数组、双指针、排序
- 难度:中等
题目大意
给定两位客户的空闲时间表:slots1
和 slots2
,再给定会议的预计持续时间 duration
。
其中 slots1[i] = [start_i, end_i]
表示空闲时间第从 start_i
开始,到 end_i
结束。 slots2
也是如此。
要求:为他们安排合适的会议时间,如果有合适的会议时间,则返回该时间的起止时刻。如果没有满足要求的会议时间,就请返回一个 空数组。
- 会议时间:两位客户都有空参加,并且持续时间能够满足预计时间
duration
的最早的时间间隔。
注意: 题目保证数据有效。同一个人的空闲时间不会出现交叠的情况,也就是说,对于同一个人的两个空闲时间 [start1, end1]
和 [start2, end2]
,要么 start1 > end2
,要么 start2 > end1
。
解题思路
题目保证了同一个人的空闲时间不会出现交叠。那么可以先直接对两个客户的空间时间表按照开始时间从小到大排序。然后使用分离双指针来遍历两个数组,求出重合部分,并判断重合区间是否大于等于 duration
。具体做法如下:
- 先对两个数组排序。使用两个指针
left_1
、left_2
。left_1
指向第一个数组开始位置,left_2
指向第二个数组开始位置。 - 遍历两个数组。计算当前两个空闲时间区间的重叠范围。
- 如果重叠范围大于等于
duration
,直接返回当前重叠范围开始时间和会议结束时间,即[start, start + duration]
,start
为重叠范围开始时间。 - 如果第一个客户的空闲结束时间小于第二个客户的空闲结束时间,则令
left_1
右移,即left_1 += 1
,继续比较重叠范围。 - 如果第一个客户的空闲结束时间大于等于第二个客户的空闲结束时间,则令
left_2
右移,即left_2 += 1
,继续比较重叠范围。
- 如果重叠范围大于等于
- 直到
left_1 == len(slots1)
或者left_2 == len(slots2)
时跳出循环,返回空数组[]
。
代码
class Solution:
def minAvailableDuration(self, slots1: List[List[int]], slots2: List[List[int]], duration: int) -> List[int]:
slots1.sort()
slots2.sort()
size1 = len(slots1)
size2 = len(slots2)
left_1, left_2 = 0, 0
while left_1 < size1 and left_2 < size2:
start_1, end_1 = slots1[left_1]
start_2, end_2 = slots2[left_2]
start = max(start_1, start_2)
end = min(end_1, end_2)
if end - start >= duration:
return [start, start + duration]
if end_1 < end_2:
left_1 += 1
else:
left_2 += 1
return []