Determine if two given time ranges overlap
举个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 0 2 4 6 8 10 12 14 16 18 20 22 24 Hour: |--|--|--|--|--|--|--|--|--|--|--|--| A: ------| |--------- B: |-----------| C: ---| |------------ D: |--------| E: |-----| A(from 18:00 to 04:00) B(from 02:00 to 10:00) C(from 16:00 to 02:00) D(from 00:00 to 06:00) E(from 20:00 to 00:00) |
确定两个给定时间范围是否重叠的最有效方法是什么?
请注意,如果时间范围在02:00和10:00(b)之间,它将与02:00和04:00(a)之间的时间范围重叠。
我试图用
在一般情况下,对于给定的A,B的值有三个区域,因此无论如何,您都必须检查它们。相对简单的方法是"移动"一个范围,使其从00:00开始,如下所示:
2首先,您需要规范化您的时间间隔:如果一个时间间隔结束到第二天,即结束时间早于开始时间,则在结束时间加上24小时。
现在您的时间间隔如下:
1 2 3 4 5 | A(from 18:00 to 28:00) B(from 02:00 to 10:00) C(from 16:00 to 26:00) D(from 00:00 to 06:00) E(from 20:00 to 00:00) |
如果您使用的是
标准化间隔后,可以使用常规公式确定重叠:
1 2 3 4 | int overlap = MIN(a.end, b.end) - MAX(a.begin, b.begin); if (overlap > 0) { ... } |