新闻资讯
咨询热线
0898-85354367传真:0898-48369099
2025-08-09:重新安排会议得到最多空余时间Ⅱ。用go语言给出一个整数 eventTime表示活动从 t=0 到 t
你可以最多对其中一个会议做平移操作(仅改变其起止时间位置,时长保持不变),并且移动后的会议必须仍然位于 [0, eventTime] 之内且与其它会议互不重叠。移动后各会议的先后顺序可以改变,也可以选择不移动任何会议。
目标是通过至多一次这样的平移,使时间轴上最长的不被任何会议占用的连续时段尽可能长。请输出在最佳移动方案下这一最长连续空闲时长。

1.初始空闲时间:在不移动任何会议的情况下,最长空闲时间是所有相邻会议之间的间隔以及首尾的空闲时间的最大值。
2.移动一个会议的影响:移动一个会议可以尝试“填补”某些小的空闲时间,从而创造更大的空闲时间。
• 遍历所有会议,计算相邻会议之间的间隔以及首尾的空闲时间,记录最大值max_gap。
• 对于每个会议i,尝试将其移除,然后计算移除后的空闲时间(即startTime[i+1] - endTime[i-1],假设i不是首尾会议)。
• 对于每个可能的插入位置,计算新的空闲时间(即插入后相邻会议之间的间隔和首尾空闲时间),并更新max_gap。
• 实际上,移动一个会议i的最优效果通常是将其“填补”到某个小的间隙中,从而合并两个相邻的空闲时间。
• 因此,可以优先考虑移动那些持续时间较短的会议(因为更容易“填补”到小的间隙中)。
• 将会议i插入到其他位置后,原来的left_gap + right_gap + duration会成为新的空闲时间(因为移除了会议i的占用)。
• 优化:实际上可以预处理所有间隙,然后对于每个会议i,尝试插入到最大的可用间隙中,可以优化到O(n log n)或O(n)。
• 对于每个会议i,移除后可以尝试插入到最大的间隙中(只要duration = gap)。
• 这样可以将时间复杂度优化到O(n log n)(排序间隙)或O(n)(如果间隙已经有序)。

# -*-coding:utf-8-*- def max_free_time(eventTime: int, startTime: list, endTime: list) - int: n = len(startTime) if n == 0: return eventTime q = [False] * n t1, t2 = 0, 0 for i in range(n): if endTime[i] - startTime[i] = t1: q[i] = True if i == 0: t1 = max(t1, startTime[i]) else: t1 = max(t1, startTime[i] - endTime[i-1]) j = n - i - 1 if endTime[j] - startTime[j] = t2: q[j] = True if i == 0: t2 = max(t2, eventTime - endTime[n-1]) else: # 对应 Go 中的 startTime[n-i] - endTime[n-i-1] t2 = max(t2, startTime[n - i] - endTime[n - i - 1]) res = 0 for i in range(n): left = 0if i == 0else endTime[i-1] right = eventTime if i == n-1else startTime[i+1] if q[i]: res = max(res, right - left) else: res = max(res, right - left - (endTime[i] - startTime[i])) return res if __name__ == __main__: eventTime = 5 startTime = [1, 3] endTime = [2, 5] result = max_free_time(eventTime, startTime, endTime) print(result)

我们相信Go语言和算法为普通开发者提供了困境的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的Go语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大规模架构师每日一题”,让 Go 语言和算法助力您的职业发展


