你有N个人每个人都有一个空闲时间段的列表。
例如,1号人物的自由时间段可能是[(9,9.5);(11,12.5)],这意味着他在9:30到9:00到12:30之间是自由的。
你想找一个时间段,这样你就可以召集所有n个人,开一个2小时的会议。
编写方法:
输入:
列表的列表,其中的每个列表都是
人
输出:
一个或多个时间段,您可以使用该时间段召开N人会议
两个小时;或者你找不到这样的时间段
我想是这样的:
两个人的时间段列表合并方式如下:如果两个时间段不重叠,则删除具有早开始时间的时间段列表;否则,将重叠部分(新的时间段)放入新列表,并删除具有早开始时间的时间段列表继续合并。
合并完成后,我们得到一个两个人时间重叠的新列表,然后将其与第三个人合并,依此类推,直到所有列表都合并。
扫描最后合并的列表,找出2小时的时间段。
如果假设每个人都有M
空闲时间段,则此算法为**o(n*m)。
有更好的解决办法吗?
最佳答案
输入的大小为N*M,因此无法获得更好的时间复杂性——必须读取所有输入。
起初我误解了这个问题,并将算法张贴在下面;它的时间复杂度略大于输入大小(cc),但解决了更一般的情况,当您想最大化会议上的人数时,如果他们不能同时满足所有的需求。
1. Merge periods (a, b), (b, c) into (a, c)
2. Forget periods shorter than 2 hours
3. Transform your input into list of
(timestamp_of_beginning, person_id, True)
(timestamp_of_ending - 2 hours, person_id, False)
4. Sort the list by first element of tuple
5. Iterate over the list, with a set A,
adding person_id to A on (_, person_id, True),
and removing on (_, person_id, False).
If after processing some item (t, _, _)
A has k elements, you can have a meeting of k persons, their ids are in A.
6. The maximal size of A during iteration is the maximal number of persons
that can have the meeting.
关于algorithm - 此调度算法有更好的解决方案吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22037617/