【发布时间】:2014-07-20 00:12:36
【问题描述】:
我有一个元素列表,其中每个元素都是一个非负整数范围。我想过滤列表,以便只分离出最大的未封闭范围。我想以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中的解决方案会很棒。
【问题讨论】:
-
您对列表呈现给您的顺序有什么保证-在您的示例中,它是由
start, end排序的-总是这样吗?你想对部分重叠的范围做什么,例如1-6, 3-8? -
使用Interval Tree保证O(nlogn)。
-
假设它们按起始值排序,您可以执行 O(n),我合并重叠的连续范围。当它们不再重叠时,您将继续下一个。
-
好吧,一旦合并,这些范围实际上会以一个
0-42大范围结束,对吧?这就是你要找的东西吗?
标签: java algorithm sorting data-structures