合并两个未排序的整数数组,而不使用Set in Java

时间:2014-02-24 18:07:23

标签: java arrays sorting

给定两个整数数组,创建包含两个数组中非重复值的第三个数组。不能在Java中使用Set实现,这是我解决它的方法和我希望找到一个具有更好的运行时复杂性的解决方案。

我的实施:

public static void removeDuplicates(int[] arr1, int[] arr2){
        int[] arr = new int[arr1.length + arr2.length];
        int index=0,i,j;

        for (i=0;i<arr1.length;i++){
            if(!contains(arr, arr1[i])){
                arr[index++]=arr1[i];
            }
        }

        for (j = 0; j < arr2.length; j++) {
            if (!contains(arr, arr2[j])) {
                arr[index++] = arr2[j];
            }
        }

        for (int a: arr)
            System.out.println(a);
    }

    private static boolean contains(int[] arr, int i) {
        for (int a: arr){
            if(a==i) return true;
        }
        return false;
    }

1 个答案:

答案 0 :(得分:1)

由于contains调用,这确实是二次复杂度。您可以通过首先对两个数组进行排序来改进算法,然后进行合并,类似于在mergesort的合并步骤中执行的操作,但仅在前一个条目不相同时才添加条目。

在合并后,您必须使用数据保留对最后一个索引的引用,这样您最终可以将数组调整为较小的数组并避免使用空单元格。

<强>更新 合并部分的一些精度:您将从两个排序数组的开头开始,并在此索引处获取两个项中较小的项,然后递增您为其中一个数组的索引。考虑您的数组abtarget是您的目标数组,i a的索引光标,j b }和k target

  1. 您从i = j = k = 0
  2. 开始
  3. 如果您从v = min(a[i], b[j])取得i,则取a并增加相关索引j
  4. 如果target[k-1] == v(当然是k > 0时),您只需递增k(即忽略数值已经在数组中)
  5. 否则你target[k++] = v(即将v放在k的索引target,然后递增k
  6. 最后,您将k等于目标数组的实际大小,以便您可以将数组修剪为大小为k <= a.length + b.length的数组
  7. 当然,在这个过程中,一旦你耗尽了两个阵列中的一个,你只需从另一个阵列中取出并与target中的最后一个值进行比较。