假设我有3个连续数字数组
a = [1, 2, 3]
b = [2, 3, 4]
c = [3, 4]
然后在所有3个数组中出现的相同数字是3。
我的算法是彼此使用两个for
循环来检查同一数组,然后将其推入另一个数组(我们称之为d
)。然后
d = [2, 3] (d = a overlap b)
并再次使用它检查数组d
和c
=>最终结果为1,因为在所有3个数组中只有1个数字出现。
e = [3] (e = c overlap d) => e.length = 1
除此之外,如果仅存在1个数组,则算法应返回数组的长度,因为其所有数字均会出现在数组中。但是我认为我上面所说的算法将花费很长时间,因为数组的数量最多可以达到10 ^ 5。那么,有什么更好的算法的想法吗?
答案 0 :(得分:5)
但是我认为我上面所说的算法会花费很长时间,因为数组的数量最多可以达到10 5 。那么,有什么更好的算法的想法吗?
是的,因为这些是范围,所以您基本上要计算范围的交集。这意味着您可以计算列表中所有 first 元素的最大 m 和所有 last的最小值 n 列表中的元素。这样, m 和 n 之间的所有数字(包括两端)都是所有列表的成员。如果 m> n ,则这些列表中没有数字。
您无需通过枚举第一个列表来计算重叠,并检查它们是否为最后一个列表的成员。由于这些是连续的数字,因此我们可以轻松找出重叠部分。
简而言之, [a,...,b] 和 [c,...,d] 的重叠为 [ max( a , c ),...,min( b , d )] ,无需检查之间的元素。