我有一个列表中的范围如下:
ranges = [(1, 50), (49, 70), (75, 85), (84, 88), (87, 92)]
我想找到这些区间中能够构成最长范围的区间 (当它们彼此重叠时)。
[(1, 70), (75, 92)]
我有一个解决方案,但它过于复杂,我相信一定有更简单的方法来解决这个问题。
我的解决方案:
def overlap(x, y):
return range(max(x[0], y[0]), min(x[-1], y[-1]) + 1)
ranges = [(1, 50), (49, 70), (75, 85), (84, 88), (87, 92)]
beg, end = min([x[0] for x in ranges]), 0
for i in ranges:
if i[0] == beg:
end = i[1]
while beg:
for _ in ranges:
for i in ranges:
if i[1] > end and overlap(i, [beg, end]):
end = i[1]
print(beg, end)
try:
beg = min([x[0] for x in ranges if x[0] > end])
for i in ranges:
if i[0] == beg:
end = i[1]
except ValueError:
beg = None
输出:
1 70
75 92