我有一个嵌套列表(已使用键作为开始元素进行排序)定义为;
L=[[0,3],[1,2],[4,5],[6]]
目标是获取所有不重叠子间隔的元组。因此输出应该看起来像;
[([0,3],[4,5],[6]),([1,2],[4,5],[6])]
我可以使用以下代码对连续的元素进行成对比较;
overlap=False
Lnew=[]
for i in range(len(L)-1):
overlap=False
if L[i+1][0]<L[i][1]:
overlap=True
if overlap==False:
Lnew.append((L[i],L[i+1]))
这个想法给了我以下输出;
[([1, 2], [4, 5]), ([4, 5], [6])]
如图所示,它每次给我一对,这与所需的输出不同。我可以获取有关如何修改逻辑以获得所需输出的帮助吗?请注意,它需要在线性时间内完成。那将真的很有帮助。谢谢。
答案 0 :(得分:1)
这里的递归思想是,只要您发现重叠的间隔,便有了新的起点。那就是递归的本质。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
在这里,停顿点已经到手,并且已经解决了所有子问题。
# recursive non-overlapping interval finder
data = [[0,3],[1,2],[4,5],[6]]
data2 = [[0,5],[4,8],[7,15]]
def search( x: list,
result: list) -> list:
# stopping condition #1 ... last element was overlapped and is a singleton
if len(x) == 1:
result.append(tuple([x[0]]))
return result
temp = [x[0]] # to hold intermediate result, starting with first input element
for idx, element in enumerate(x[1:], 1):
if element[0] >= temp[-1][1]:
temp.append(element)
else: # found a new starting point
search(x[idx:], result)
result.append(tuple(temp))
return(result)
print(f'\nsearching {data}')
res = search(data, [])
for t in res:
print(t)
print(f'\nsearching {data2}')
res = search(data2, [])
for t in res:
print(t)
searching [[0, 3], [1, 2], [4, 5], [6]]
([1, 2], [4, 5], [6])
([0, 3], [4, 5], [6])
searching [[0, 5], [4, 8], [7, 15]]
([7, 15],)
([4, 8],)
([0, 5], [7, 15])
[Finished in 0.0s]