您可以先排序来解决此问题:import operator
ranges=[[0,1,2,3,4], [1,2], [0,1], [2,3,4], [3,4,5], [3,4,5,6], [4,5], [6,7], [5,6]]
sorted_ranges = sorted(ranges,key=operator.itemgetter(-1),reverse=True)
sorted_ranges = sorted(sorted_ranges,key=operator.itemgetter(0))
filtered = []
i,j = 0,0
while i < len(sorted_ranges):
filtered.append(sorted_ranges[i])
j = i+1
while j < len(sorted_ranges) and sorted_ranges[i][-1] >= sorted_ranges[j][-1]:
print "Remove " , sorted_ranges.pop(j) , "dominated by",sorted_ranges[i]
i+=1
print "RESULT",filtered
您需要对第一个元素按升序和降序对最后一个元素进行排序。
我使用了两个显式的sorted调用,但您可以定义您的cmp函数来在一个过程中完成此操作:
^{pr2}$
以这种方式,支配范围将首先出现。
请注意,排序后的嵌套while循环的复杂性为O(n),因为每个元素只被检查一次,并且要么被删除,要么添加到最终的集合中。
整个算法的复杂度为O(nlogn)