【发布时间】:2023-03-31 07:01:01
【问题描述】:
我正在编写这个方法来查找 3 个数组中的公共数字的数量(允许重复,例如 if A=[1,3,3,3,6], B=[3,3,1,5], C=[3,3,1,5,2] 然后方法应该返回 3;两个 3 + 一个 1)。我使用了 3 个 for 循环,但我觉得应该有更好的方法来做到这一点。
这是我的代码:
private static int common(int[] A, int[] B, int[] C)
{
int c=0;
List<Integer> visitedBs=new ArrayList<Integer>(), visitedCs=new ArrayList<Integer>();
for (int i = 0; i < A.length; i++)
outerloop:
for (int j = 0; j <B.length ; j++)
if (A[i]==B[j] && !visitedBs.contains(j))
for (int k = 0; k < C.length; k++)
if (B[j] == C[k] && !visitedCs.contains(k)) {
c++;
visitedBs.add(j);
visitedCs.add(k);
break outerloop;
}
return c;
}
有人知道我应该如何降低时间复杂度吗?有没有办法使用 2 个 for 循环来代替?
【问题讨论】:
-
这真的是三次方,而不是 4 次方,这要归功于通过
visitedCs进行的线性搜索? -
你可以在 O(n log n) 内完成。首先对每个数组进行排序,然后使用一个循环,在这些数组中只增加三个索引。注释太短,无法给出算法。你自己可能会发现。
-
@harold 有趣!我没有考虑到这一点。我认为这可能是第四次幂。有没有办法避免使用'''visitedCs'''?
-
@Seelenvirtuose 我认为这可行。我会试一试。谢谢!
-
Java 有没有类似于 Python 的
collections.Counter的东西?这将为您提供线性时间解决方案。 (本质上,sum((Counter(A) & Counter(B) & Counter(C)).values())。)
标签: java algorithm performance time-complexity