给定两个未排序的数组A和B,通过仅对数组中的一个进行排序,找到一对总和(或差)等于给定k的元素对

时间:2018-08-30 21:30:40

标签: arrays algorithm

假设我们有两个给定的 unsorted 数组A和B,找到了几对元素(例如,第一个元素属于A,第二个元素属于B),它们的和(或差?)相等通过仅对数组之一进行排序来给定k-

我想知道是否有一种算法具有很好的复杂性。 无论如何,我都试图使用该链接Given two arrays a and b .Find all pairs of elements (a1,b1) such that a1 belongs to Array A and b1 belongs to Array B whose sum a1+b1 = k ,但是我发现它无济于事,因为我不喜欢任何仅使用一种排序的解决方案。

3 个答案:

答案 0 :(得分:2)

我的解决方案,假设对这个问题没有空间限制,假设A的长度为n,而B的长度为k

-对于数组aA迭代)中的每个元素n,将k-a-k-ak+a存储在HashSet /中一些具有O(1)contains()函数的类似数据结构。

-然后,对于数组bB迭代)中的每个元素k,使用O(1){检查b是否在哈希集/映射中{ {1}}功能。如果是,则完成操作并返回contains()和相应的b值,以使aa+b=ka-b=k(我不确定是否还是不是您要考虑此问题的差异,这取决于您)。

总而言之,该算法在最大O(n + k)时间内运行,空间复杂度为O(3n)(假设WLOG为b-a=k,以最大化效率)。这两个术语都是线性的,这意味着如果存在一对n < k可以解决问题,则可以相对较快地找到它们,而无需进行排序。

希望这会有所帮助,对格式不佳表示抱歉(我希望SO能够支持Latex,这对于此类问题非常有用)。如果您需要帮助来理解我所做的事情,请发表评论/问题,因为它可能很不清楚。

答案 1 :(得分:1)

由于问题需要对至少一个数组进行排序,因此不可能有比O(n*log(n))更好的时间复杂度。

解决此问题的一种可能方法是对数组A进行排序,并遍历数组B。对于属于x的每个B,二进制搜索值{{1} }在(K - x)上。如果存在,那么,我们已经找到了一对。

遍历B的总运行时复杂度为O(n),对A进行的每个二进制搜索为O(log(n)),因此为我们提供了找到我们所需的一对。

如果数组A可变以将我们的空间复杂度限制为A,我们可以使用像Quicksort这样的就地排序算法。

答案 2 :(得分:0)

这是您要寻找的吗?

Sort(A)
for( b : B)
  if A.Find(k-b)
    print k-b, b