【发布时间】:2015-09-20 06:10:57
【问题描述】:
我已经阅读了现有的解决方案,但没有一个能满足我的问题。
问题:给定两个已知相等大小的数组n,用两个数组的共同元素创建第三个数组。 (假设每个数组中没有重复项)
示例:
A[] = {5, 4, 12, 15, 9}
B[] = {4, 9, 7, 6, 12}
我的解决方案:
我想到了先把数组排序成:
A[] = {4, 5, 9, 12, 15}
B[] = {4, 6, 7, 9, 12}
但是,我不知道如何在不避免嵌套循环的情况下找到公共元素。我使用过这样的嵌套循环:
int A[] = {5, 4, 12, 15, 9};
int B[] = {4, 9, 7, 6, 12};
// maximum common elements can be size of one array
int[] C = new int[A.length];
int idx = 0; // of C
// output check: all zero
for(int i = 0; i < C.length; i++)
System.out.println(C[i]);
// find and transfer common elements
for(int i = 0; i < A.length; i++){
for(int j = 0; j < B.length; j++){
if(A[i] == B[j])
C[idx++] = A[i];
}
}
// output check
for(int i = 0; i < C.length; i++)
System.out.println(C[i]);
但这种方法的问题在于,正如预期的那样,C[] = {4, 9, 12, 0, 0} 即最后两个元素保留为零,因为只有三个公共元素。但是,如果输入数组本身有0s,那么很难说这些零是否存在于C 中,因为它们对A 和B 都很常见,或者仅仅是因为不再存在要填写的通用元素(如上所示)。
我当然可以,先用一个嵌套循环统计公共元素m的个数,然后创建一个大小为m的数组C,然后用A和@987654334这两个公共元素填充@ 使用另一个嵌套循环,但这会很耗时。
限制:我不能使用 HashSet、HashTable 或任何 ArrayUtils 或 Java 提供的任何东西,除了简单的排序/搜索算法(因为前者还没有教给我)
问题:我上面的查询最快的方法是什么? (考虑到我发布的限制)
【问题讨论】:
-
你对输入数组有什么额外的信息,比如只有正元素?一旦你对两个数组都进行了排序(如果允许),那么你不需要嵌套循环来查找交集。
-
@abhishekbafna 数组元素可以是任何整数、负数或正数。
-
是否允许排序然后不需要嵌套循环?
-
@abhishekbafna 排序数组如何不需要嵌套循环?
-
现在程序的复杂度将是
O(n log n),那是因为排序。否则它将是O(n^2)。
标签: java arrays sorting search