java - 如何相交两个排序的整数数组而不重复?

标签 java arrays algorithm sorting

这是我用作编程练习的面试问题。

输入两个按递增顺序排序的整数数组A和B,大小分别为N和M

输出:一个按递增顺序排序的整数数组 C,其中包含同时出现在 A 和 B 中的元素

约束C中不允许重复

示例:对于输入 A = {3,6,8,9} 和 B = {4,5,6,9,10,11},输出应为 C = {6 ,9}

谢谢大家的回答!总而言之,解决这个问题有两种主要方法:

我最初的解决方案是保留两个指针,每个数组一个,并从左到右交替扫描数组,同时挑选出匹配的元素。因此,当我们一个数组的当前元素大于第二个数组时,我们不断递增第二个数组的指针,直到找到当前第一个数组元素或越过它(找到一个更大的数组)。我将所有匹配项保存在一个单独的数组中,一旦我们到达任一输入数组的末尾就会返回该数组。

我们可以这样做的另一种方法是线性扫描其中一个数组,同时使用二进制搜索在第二个数组中找到匹配项。这意味着 O(N*log(M)) 时间,如果我们扫描 A 并在 B 上对它的 N 个元素中的每一个进行二进制搜索(O(log(M)) 时间)。

我已经实现了这两种方法并进行了实验以了解两者的比较(有关详细信息,请参见 here)。当 M 大约是 N 的 70 倍时,当 N 有 100 万个元素时,二分搜索方法似乎会获胜。

最佳答案

怎么样:

public static int[] intersectSortedArrays(int[] a, int[] b){
    int[] c = new int[Math.min(a.length, b.length)]; 
    int ai = 0, bi = 0, ci = 0;
    while (ai < a.length && bi < b.length) {
        if (a[ai] < b[bi]) {
            ai++;
        } else if (a[ai] > b[bi]) {
            bi++;
        } else {
            if (ci == 0 || a[ai] != c[ci - 1]) {
                c[ci++] = a[ai];
            }
            ai++; bi++;
        }
    }
    return Arrays.copyOfRange(c, 0, ci); 
}

从概念上讲,它与您的相似,但包含一些简化。

我认为您无法改进时间复杂度。

编辑:我试过这段代码,它通过了你所有的单元测试。

关于java - 如何相交两个排序的整数数组而不重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9232413/

相关文章:

java - 带有图像 JavaFX 的 ListView

java - 使用 maven 为 eclipse 编译器设置 Java 6 注释处理配置

c - 函数中返回文件/文件夹结构的指针

algorithm - 从一系列可能有噪声、不一致或不完整的传递关系构建排名

python - 我们能在不回溯的情况下解决 N 个皇后吗?以及如何计算以及回溯解决方案的复杂度是多少?

java - MySQL 结果字符串中的空格

Java - 使用函数式接口(interface)和 lambda 表达式进行日志记录

javascript - 如何在初始化时通过操作其他键来直接获取相同的对象属性

javascript - 如何在javascript中将对象数组转换为数组对象?

.NET 正确排序 double 作为数字字符串