我有一个元素列表,其中每个元素都是一个非负整数范围。我想以这样一种方式过滤列表,即只分离出最大的未封闭范围。我希望以O(n)
方式使用单循环执行此操作。此列表将始终根据每个范围的起始整数进行排序。封闭范围元素可能出现在列表中的封闭范围元素之前或之后。
示例:
假设我拥有的列表是{[0-12],[5-15],[5-20],[10-20],[11-30],[25-42],[28-40]}
。在此列表中,范围[5-15]
和[10-20]
属于[5-20]
范围,因此我需要将其丢弃。同样,范围元素[28-40]
会被丢弃,因为它属于范围[25-42]
。
我想使用单个循环进行此过滤以实现O(n)
时间复杂度。
有可能实现这一目标吗?如果不是,那么使用超过O(n)
的复杂度进行过滤的最佳方法是什么。 Java中的解决方案会很棒。
答案 0 :(得分:5)
如果元素具有相同的范围开始但更大或相等的结束,则元素可以吞下前一个元素。如果下一个范围的结束时间小于当前元素的结束,那么元素也可以吞下。
因此,您将浏览列表并比较当前和下一个元素。
如果他们有currentStart = nextStart和nextEnd> = currentEnd - >删除当前。
else if nextEnd< = currentEnd - >删除下一步。
答案 1 :(得分:0)
在伪代码中,合并期间可以这样做:
def merge(l:list[period], e:period):
if l == nil:
return list(e)
else:
lh = l.head
ll = l.tail
if e.end < lh.start:
return e::l // original list prepended with e
else if lh.end < e.start:
return lh::merge(e,ll) // head + trying to merge period with the tail
else: //overlap, make new period from e and list head and merge it with tail
newstart = min(e.start, lh.start)
newend = max(e.end, lh.end)
return merge(period(newstart,newend), ll)
在你的情况下,你必须进行差异/合并,但这个想法是相似的。