【问题标题】:Find intersection of two arrays查找两个数组的交集
【发布时间】: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 中,因为它们对AB 都很常见,或者仅仅是因为不再存在要填写的通用元素(如上所示)。

我当然可以,先用一个嵌套循环统计公共元素m的个数,然后创建一个大小为m的数组C,然后用A和@987654334这两个公共元素填充@ 使用另一个嵌套循环,但这会很耗时。

限制:我不能使用 HashSet、HashTable 或任何 ArrayUtils 或 Java 提供的任何东西,除了简单的排序/搜索算法(因为前者还没有教给我)

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

【问题讨论】:

  • 你对输入数组有什么额外的信息,比如只有正元素?一旦你对两个数组都进行了排序(如果允许),那么你不需要嵌套循环来查找交集。
  • @abhishekbafna 数组元素可以是任何整数、负数或正数。
  • 是否允许排序然后不需要嵌套循环?
  • @abhishekbafna 排序数组如何不需要嵌套循环?
  • 现在程序的复杂度将是O(n log n),那是因为排序。否则它将是O(n^2)

标签: java arrays sorting search


【解决方案1】:

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

  1. 如果元素相同,则将该元素放入第三个数组中。
  2. 如果 first 较小,则为该数组增加计数器,否则为其他数组增加计数器。
  3. 计数将为您提供数组中公共元素的数量。

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

【讨论】:

    【解决方案2】:

    您已经在维护一个计数,idx,公共元素。所以 无需依赖像“0”这样的标记值来查看哪个 实际上找到了共同的元素——你已经知道找到了多少。

    【讨论】:

    • 啊!我居然没看到!
    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2013-07-25
    • 2012-05-12
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多