类事件 { int start, end; }
使用快速排序对事件进行如下排序:
- 开始时间小于事件 y 开始时间的事件 x 必须首先出现在数组中。
- 开始时间等于事件 y 开始时间且结束时间小于 y 结束时间的事件 x 必须首先出现在数组中。
然后,将 inActionEvent 设置为事件 0。遍历事件数组,并且对于不与 inActionEvent 重叠的每个事件 i 获得它们之间的空闲时间。每次检查 inActionEvent 和 i 事件之间的重叠后,如果它们不重叠,则将 inActionEvent 更改为 i 事件。如果它们重叠并且 i 结束时间大于 inActionEvent 结束时间,则将 inActionEvent 设置为 i 事件。否则保持 inActionEvent 原样(inActionEvent 可以在 i 事件之前开始并在我完成后结束,在这种情况下,您不要用 i 事件替换 inActionEvent)。
复杂性:O(n * lg n) 用于快速排序,O(n) 用于迭代 = O(nlgn),有些人可能会说它是 O(n)
您的第一个解决方案需要 O(n*n) 最小值。
这意味着这个太快了。
示例代码:
inActionEvent = 0;
// dont forget to get free time form time 0 to start time of first event
for (int i=1;i<numberOfEvents;i++)
{
if (!overlap(inActionEvent, i))
{
getFreeTimeBetweenThem(inActionEvent, i);
inActionEvent = i;
}
else
{
if (events[inActionEvent].endtime<events[i].endtime)
inActionEvent = i;
else
// do nothin
}
}
// again dont forget to get free time from last event endtime to the end of day or something.