def gen(lst):
if len(lst) < 1:
return
if len(lst) < 2:
yield lst[0]
lst = sorted(lst, key=lambda x: (x[0], x[1])) # сортируете список
print(lst)
x = lst[0][0] # начальная точка
y = lst[0][1] # конечная точка
for i in lst[1:]:
if i[0] <= y: # если в следующем списке начало равно или меньше конца предыдущего
y = i[1] # заменяем конец
else:
yield [x, y] # отдаем интервал
x = i[0] # переопределяем начало и конец
y = i[1]
yield [x,y]
return
lst = [[1, 2], [2, 3], [5, 8], [10, 11], [4, 6]]
res = []
for i in gen(lst):
res.append(i)
print(res) # [[1, 3], [4, 8], [10, 11]]
O(n^2) 不好(甚至 O(n^3)),需要优化。也许按第一个元素和第二个元素对列表进行排序会有所帮助,再加上“双指针方法”来绕过它们;这里我们需要进一步思考。
将范围的所有末端添加到对列表中
[значение, признак +1/-1 для начала или конца соответственно]
对列表进行排序
启动活动范围计数器
迭代列表,将该对的第二个字段添加到计数器中。
如果计数器从0变成1,那么新的组合范围已经开始,记住开始
如果计数器从1变成0,那么新的组合范围已经结束,将其添加到结果中
排序导致的复杂度为 O(nlogn)
默认排序会导致如果值相同则结束点先于开始点处理,因此 [0,1] 和 [1,2] 不会合并。如果需要,则可以将符号反转(-1/+1),并在通过时从计数器中减去它。