查找每个列表中至少有一个数字所属的最小范围

时间:2014-05-07 17:16:03

标签: algorithm data-structures

我有n个未排序的列表。我想找到每个列表中至少有一个数字所属的最小范围。

实施例: n = 3

列表1:9 10 5 20

清单2:2 20 9

清单3:1 12

对此的解决方案是(9,12)。

那么如何以最小的时间复杂度计算这个范围? 另外,可以在不对列表进行排序的情况下完成吗?

2 个答案:

答案 0 :(得分:3)

进行排序:

  1. 对所有列表进行排序。构造一个包含每个列表最左边点的集合X.这是你的第一个候选人inrerval。注意它的长度。
  2. 删除X的最左边的点,记下它来自哪个列表。添加同一列表中的下一个点,以便X再次包含所有列表中的点。注意新的长度。冲洗,重复。
  3. 没有排序:不知道。

答案 1 :(得分:0)

我怀疑这个想法是否是最佳,但这是我想到的第一件事。首先对集合进行排序:

5 9 10 20
2 9 20
1 12

首先,我们找到最小的"范围"仅为第一个列表。这很简单,因为它与第一个列表完全相同:

(5) (9) (10) (20)  possible minimum ranges for only the first list

首先,我们将每一个标记为" clean" *

(5*) (9*) (10*) (20*)

然后我们迭代第二个列表。对于每个元素,如果它在现有范围内,我们继续前进。否则,我们"合并"它与前一行中的单个下一个较小且单个下一个较大范围,并将这些范围标记为脏。将列表2 3与范围(5)合并时,会产生范围(2,5)(3,5)

2 -> (2,5) (9*) (10*) (20*) There is no range smaller than 2, so it only merges with (5)
9 -> (2,5) (9) (10*) (20*) Already in a range, just mark it as dirty.
20 -> (2,5) (9) (10*) (20) Already in a range, just mark it as dirty.

然后删除干净范围以及任何相邻列表的超集列表。

(2,5) (9) (20)

再次列出第三个清单:

1 -> (1,5) (9*) (20*)  Extends the (2,5) range
12 -> (1,5) (9,12) (12,20) Note the 12 merges with the (9) and the (20)
delete clean and superset ranges: (1,5) (9,12) (12,20)

你和#34;小"每个列表在该范围内具有元素的范围。只需找到最小的

(1,5) - >大小为5    (9,12) - >大小为4    (12,20) - >大小为20

由于(9,12)是最小的,所以它就是答案。