两个数组的交集与重复

Ale*_*lex 5 java algorithm

我正在尝试创建一个方法,使两个数组交叉重复.

例: {1,2,5,4,1,3} and {1,2,1} -> {1,1,2}.

我有一个交叉但不重复的方法.

  public int[] findSameElements(int[] p1, int[] p2) {
    int count = 0;
    for (int i = 0; i < p1.length; i++) {
      for (int j = 0; j < p2.length; j++) {
        if (p1[i] == p2[j]) {
          count++;
          break;
        }
      }
    }

    int[] result = new int[count];
    count = 0;
    for (int i = 0; i < p1.length; i++) {
      for (int j = 0; j < p2.length; j++) {
        if (p1[i] == p2[j]) {
          result[count++] = p1[i];
          break;
        }
      }
    }

    return result;
  }
Run Code Online (Sandbox Code Playgroud)

如何在不使用Arrays.*或添加重复的情况下添加List.*

Тол*_*оля 5

请尝试以下功能:

public int[] findSameElements(int[] p1, int[] p2)
{
    int count = 0;
    bool[] choosen = new bool[p2.length];

    for (int i = 0; i < p1.length; i++)
    {
        for (int j = 0; j < p2.length; j++)
        {
            if (!choosen[j] && p1[i] == p2[j])
            {
                choosen[j] = true;
                count++;
                break;
            }
        }
    }

    int[] result = new int[count];
    count = 0;
    for (int i = 0; i < p2.length; i++)
    {
        if (choosen[i])
        {
            result[count] = p2[i];
            count++;
        }
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

如有必要,您还应该应用排序,此解决方案具有O(N ^ 2)复杂度.也可能使O(NLogN)复杂化.