假设我们有两个给定的 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 ,但是我发现它无济于事,因为我不喜欢任何仅使用一种排序的解决方案。
答案 0 :(得分:2)
我的解决方案,假设对这个问题没有空间限制,假设A
的长度为n
,而B
的长度为k
:
-对于数组a
(A
迭代)中的每个元素n
,将k-a
,-k-a
和k+a
存储在HashSet /中一些具有O(1)contains()
函数的类似数据结构。
-然后,对于数组b
(B
迭代)中的每个元素k
,使用O(1){检查b
是否在哈希集/映射中{ {1}}功能。如果是,则完成操作并返回contains()
和相应的b
值,以使a
,a+b=k
或a-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