我们可以用 o(n) 来解决这个问题。如果我们使用 Set 数据结构并考虑初始容量和负载因子,这是可能的。
public static boolean checkThreeWaySetDisjointness(Set<Integer> a, Set<Integer> b, Set<Integer> c)
{
int capacity = Math.round((a.size() + b.size()) / 0.75f) + 1;
Set<Integer> container = new HashSet<Integer>(capacity);
container.addAll(a);
for (int element : b)
{
if (!container.add(element))
{
if (c.contains(element))
{
return false;
}
}
}
return true;
}
我们正在创建新的 Set 容器,因为如果我们直接在任何现有的 Set a/b/c 中添加,一旦其容量达到实际大小的 75%,java 将在内部创建新的 Hashset 并将整个现有 Set 复制到其中。此开销将具有 O(n) 的复杂性。因此,我们在这里创建新的大小容量的 HashSet,这将确保不会产生复制开销。然后复制整个集合 a,然后继续从集合 b 中一个接一个地添加元素。在 Java 中,如果 add() 返回 false 意味着元素已经存在于当前集合中。如果是,只需在第三组 c 中检查是否相同。HashSet 的方法 add 和 contains 的复杂度为 O(1),因此整个代码在 O(n) 中运行。