在[a,b]间隔之间找到相同的数字

时间:2019-05-25 12:35:29

标签: c++ algorithm

假设我有3个连续数字数组

a = [1, 2, 3]
b = [2, 3, 4]
c = [3, 4]

然后在所有3个数组中出现的相同数字是3。 我的算法是彼此使用两个for循环来检查同一数组,然后将其推入另一个数组(我们称之为d)。然后

d = [2, 3] (d = a overlap b)

并再次使用它检查数组dc =>最终结果为1,因为在所有3个数组中只有1个数字出现。

e = [3] (e = c overlap d) => e.length = 1

除此之外,如果仅存在1个数组,则算法应返回数组的长度,因为其所有数字均会出现在数组中。但是我认为我上面所说的算法将花费很长时间,因为数组的数量最多可以达到10 ^ 5。那么,有什么更好的算法的想法吗?

1 个答案:

答案 0 :(得分:5)

  

但是我认为我上面所说的算法会花费很长时间,因为数组的数量最多可以达到10 5 。那么,有什么更好的算法的想法吗?

是的,因为这些是范围,所以您基本上要计算范围的交集。这意味着您可以计算列表中所有 first 元素的最大 m 和所有 last的最小值 n 列表中的元素。这样, m n 之间的所有数字(包括两端)都是所有列表的成员。如果 m> n ,则这些列表中没有数字。

您无需通过枚举第一个列表来计算重叠,并检查它们是否为最后一个列表的成员。由于这些是连续的数字,因此我们可以轻松找出重叠部分。

简而言之, [a,...,b] [c,...,d] 的重叠为 [ max( a c ),...,min( b d ] ,无需检查之间的元素。