计算包含范围的两个列表之间的交集/截距

本文关键字:之间 列表 两个 截距 范围 包含 计算 | 更新日期: 2023-09-27 18:24:40

我正试图找到反向交叉点,看看两支球队是否可以相互比赛,但很难找到准确的代码。

代表以下范围的类将包含两个属性,开始时间和结束时间,可以是日期时间或时间跨度。每个团队都可以有一个列表。时间跨度属性为分钟,因此下午2:21有效。

第一队不能在列出的两个时间之间比赛,所以他们只能在上午10:00到下午5:00之间比赛。不过,我们会存储排除情况。

第二队可以在上午8:00-下午12:00进行比赛。

这意味着一队和二队可以在10-12之间比赛。有没有一个好的方法可以在代码中计算出来?

团队1

List<Restriction>
     Restriction
          StartTime: 8:00 AM
          EndTime: 10:00 AM
     Restriction
          StartTime: 5:00 PM
          EndTime: 9:00 PM

团队2

List<Restriction>
     Restriction
          StartTime: 12:00 PM
          EndTime: 9:00 PM

计算包含范围的两个列表之间的交集/截距

创建一个所有开始和结束时间的数组,包括+1或-1,具体取决于每个时间是开始时间还是结束时间。

对于你的一组时间,这会给你:

[(08:00, +1), (10:00, -1), (17:00, +1), (21:00, -1), (12:00, +1), (21:00, -1)]

排序:

[(08:00, +1), (10:00, -1), (12:00, +1), (17:00, +1), (21:00, -1), (21:00, -1)]

进行正负1的连续求和:

[(08:00, 1), (10:00, 0), (12:00, 1), (17:00, 2), (21:00, 1), (21:00, 0)]

运行总和是指当时正忙于启动的团队数量(0、1或2)。因此,现在标记为0的时间是两队都有空的开始时间(这里是10:00和21:00)。数组中的下一个时间是空闲周期的结束时间。这给出了两支球队都空闲的时间段,包括开始和结束时的时间段是(-无穷大到08:00)、(10:00到12:00)和(21:00到+无穷大)。