Все решения, которые проверяют множество условий, основанных на том, где диапазоны находятся относительно друг друга, могут быть значительно упрощены , просто гарантируя, что определенный диапазон начинается раньше! Вы гарантируете, что первый диапазон запускается раньше (или в то же время) путем замены диапазонов, если это необходимо, спереди.
Затем вы можете обнаружить перекрытие, если другой пуск диапазона меньше или равен первому концу диапазона (если диапазоны включительно, включая как начальное, так и конечное время) или меньше (если диапазоны включают начало и исключение конца).
Предполагая, что на обоих концах включено все, существует только четыре возможности, overlap:
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
Конечная точка диапазона 2 не входит в нее. Итак, в псевдокоде:
def doesOverlap (r1, r2):
if r1.s > r2.s:
swap r1, r2
if r2.s > r1.e:
return false
return true
Это может быть еще более упрощено:
def doesOverlap (r1, r2):
if r1.s > r2.s:
swap r1, r2
return r2.s <= r1.e
Если диапазоны включены в начале и в конце, вы должны просто замените >
на >=
во втором операторе if
(для первого сегмента кода: во втором сегменте кода вы должны использовать <
, а не <=
):
|----------------------| range 1
|---> range 2 overlap
|---> range 2 overlap
|---> range 2 no overlap
|---> range 2 no overlap
Вы сильно ограничиваете количество проверок, которые вы должны выполнить, потому что вы сначала удаляете половину проблемного пространства, гарантируя, что диапазон 1 никогда не запускается после диапазона 2.