题目:安排会议日程
- 你是一名行政助理,手里有两位客户的空闲时间表:slots1 和 slots2,以及会议的预计持续时间
duration
,请你为他们安排合适的会议时间。
- 「会议时间」是两位客户都有空参加,并且持续时间能够满足预计时间
duration
的 最早的时间间隔。
- 如果没有满足要求的会议时间,就请返回一个 空数组。
「空闲时间」的格式是
[start, end]
,由开始时间start
和结束时间end
组成,表示从start
开始,到end
结束。
- 题目保证数据有效:同一个人的空闲时间不会出现交叠的情况,也就是说,对于同一个人的两个空闲时间
[start1, end1]
和[start2, end2]
,要么start1 > end2
,要么start2 > end1
。
示例 1:
输入:slots1 = [[10,50],[60,120],[140,210]], slots2 = [[0,15],[60,70]], duration = 8
输出:[60,68]
示例 2:
输入:slots1 = [[10,50],[60,120],[140,210]], slots2 = [[0,15],[60,70]], duration = 12
输出:[]
提示:
- 1 <= slots1.length, slots2.length <= 10^4
- slots1[i].length, slots2[i].length == 2
- slots1[i][0] < slots1[i][1]
- slots2[i][0] < slots2[i][1]
- 0 <= slots1[i][j], slots2[i][j] <= 10^9
- 1 <= duration <= 10^6
来源:力扣(LeetCode)第5089题(临时)
链接:https://leetcode-cn.com/problems/meeting-scheduler
分析:
- 我们使用两个指针分别指向
slots1
和slots2
,计作i,j。
- 我们判断当前i和j指向的那个时间段最大的开始时间和最小的结束时间之内是否可以容纳
duration
。
- 如果可以容纳的话就直接返回结果,如果不行,我们将结束时间小的那个指针向前走一个位置,让他比另一个指针的结束时间大。
- 如果没找到的话,返回空。
代码:
class Solution(object):
def minAvailableDuration(self, slots1, slots2, duration):
slots1.sort(key=lambda x : x[0]) # 先将两个数组排序一下。
slots2.sort(key=lambda x : x[0])
m1, m2 = len(slots1), len(slots2)
i = j = 0
while i < m1 and j < m2: # 双指针的结束条件
st = max(slots1[i][0], slots2[j][0]) # 找到开始时间大的那个
en = min(slots1[i][1], slots2[j][1]) # 找到结束时间小的那个。
if st + duration <= en: # 看一下st到en之间是否可以容纳duration
return [st, st+duration]
if slots1[i][1] < slots2[j][1]: # 谁的结束时间小,谁就往前走。
i += 1
else:
j += 1