找到两个数组的交集

时间:2015-09-20 06:10:57

标签: java arrays sorting search

我已经阅读过现有的解决方案,但没有一个能解决我的问题。

问题:给定两个已知等于大小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}即最后两个元素保留为零,因为只有三个共同元素。但是,如果输入数组本身有0 s,则很难说C中是否存在这些零,因为它们对AB都是通用的或者仅仅是因为没有更多的常用元素可以填写(如上所述)。

我当然可以首先使用嵌套循环来计算公共元素的数量m,然后创建一个大小为C的数组m,然后用公共元素填充它<{1}}和A使用另一个嵌套循环,但这将非常耗时。

限制:除了简单的排序/搜索算法之外,我不能使用HashSet,HashTable或任何其他JavaUtils或Java所提供的任何东西(因此前者还没有教过我)

问题:上述查询的最快方法是什么? (考虑到我发布的限制)

1 个答案:

答案 0 :(得分:3)

您可以为每个阵列保留单独的计数器,并根据您知道的信息递增。 (数组已排序)。

  1. 如果元素相同,则将元素放在第三个数组中。
  2. 如果first较小,则递增该数组的计数器,以换取其他数组的其他增量。
  3. 计数将为您提供数组中公共元素的编号。
  4. public class SortedArray {
      public static void main(String[] args) {
        int a[] = {4, 5, 9, 12, 15};
        int b[] = {4, 6, 7, 9, 12};
        int c[] = new int[5];
        int count = 0;
    
        int i = 0; int j = 0;
        while (i<a.length && j<b.length) {
          if (a[i]==b[j]) {
            c[count] = a[i];
            count++;
            i++;
            j++;
          }
          else if (a[i] < b[j]) {
            i++;
          } else {
            j++;
          }
        }
        for (int k=0; k<count; k++) {
          System.out.print(c[k] + "\t");
        }
      }
    }
    

    输出:
    4 9 12