好吧,我昨晚很无聊,所以我用 Python 做了这个。它是不必要的递归(我刚刚阅读了 The Little Schemer 并认为递归现在非常简洁)但它解决了您的问题并处理了我向它抛出的所有输入。
intervals = [(0,4), (5,13), (8,19), (10,12)]
def overlaps(x,y):
x1, x2 = x
y1, y2 = y
return (
(x1 <= y1 <= x2) or
(x1 <= y2 <= x2) or
(y1 <= x1 <= y2) or
(y1 <= x2 <= y2)
)
def find_overlaps(intervals, checklist=None, pending=None):
if not intervals:
return []
interval = intervals.pop()
if not checklist:
return find_overlaps(intervals, [interval], [interval])
check = checklist.pop()
if overlaps(interval, check):
pending = pending or []
checklist.append(check)
checklist.append(interval)
return pending + [interval] + find_overlaps(intervals, checklist)
else:
intervals.append(interval)
return find_overlaps(intervals, checklist)
像这样使用:
>>> find_overlaps(intervals)
[(10, 12), (8, 19), (5, 13)]
请注意,它以起点的反向顺序返回所有重叠间隔。希望这是一个小问题。这只是因为我在列表中使用push()
和pop()
,它在列表的末尾运行,而不是在列表insert(0)
的pop(0)
开头运行。
这并不完美,但它在线性时间内运行。还要记住,实际字符串的大小根本不重要——运行时间与间隔数有关,而不是字符串的大小。