【发布时间】:2012-03-03 04:41:54
【问题描述】:
这是我用作编程练习的一个面试问题。
输入: 两个排序的整数数组 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 找到有关这方面的详细信息)。当 N 有 100 万个元素时,当 M 大约是 N 的 70 倍时,二分搜索方法似乎更胜一筹。
【问题讨论】:
-
请告诉我们您的问题?
-
这应该改为进行代码审查
-
仅仅因为一个数组更大,并不意味着将两个数组组合起来会产生相同的大小。
-
@BrianGraham OP 正在程序末尾创建具有适当大小的新数组,因此这应该不是问题。
-
@AKJ 如果我有
[0, 1, 2, 3, 4]和[5, 6, 4, 9, 8],则生成的交叉点大于他确定大小的方式;导致缺失值。
标签: java arrays algorithm sorting