我有n个未排序的列表。我想找到每个列表中至少有一个数字所属的最小范围。
实施例: n = 3
列表1:9 10 5 20
清单2:2 20 9
清单3:1 12
对此的解决方案是(9,12)。
那么如何以最小的时间复杂度计算这个范围? 另外,可以在不对列表进行排序的情况下完成吗?
答案 0 :(得分: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)
是最小的,所以它就是答案。