在3个数组中的每一个中找到3个元素,它们总和为给定值

时间:2014-05-31 07:17:52

标签: algorithm sum

设A,B,C为3个n元素阵列。找到一个算法,用于确定A中是否存在a,B中为b,C中为ca+b+c = k

我尝试过以下算法,但需要O(n²)

  1. 对所有3个数组进行排序。 - O(n log n)

  2. 临时数组h = k - (a+b) - O(n)

  3. 对于每个h,请在B中找到c'c' = h - B[i] - O(n)

  4. 使用二分搜索在C中搜索c' - O(log n)

  5. 总计= O(n log n) + O(n) + O(n² log n)

    我们可以在O(n log n)解决吗?

2 个答案:

答案 0 :(得分:5)

假设在S时间内存在针对此问题的解决方案O(n lg n)

我将展示3SUM的任何实例,其长度为n,线性时间数组会减少您的问题。

给定一个长度为s的数组n的3SUM实例,定义数组A = B = C = sO(n)操作。使用S(A, B, C, 0)分别确定数组a,b,c是否存在索引A,B,CA[a] + B[b] + C[c] = 0 O(n lg n)时间s。由于每个数组等于a,b,c,因此相同的值s[a] + s[b] + s[c] = 0满足3SUM' s {{1}}。

除非你要发布一些非常大的内容,否则我怀疑你的问题会有这么快的算法,这至少和3SUM一样难(你也可以用相反的方向显示减少也有一些工作。)

修改:为了明确上述段落,从3SUM开始的线性时间减少证明OP的问题是$ \ Omega(n ^ {1.5})$

答案 1 :(得分:0)

这只是3SUM问题的变体。你无法在O(n log n)中解决它 它可以用O(n ^ 2)求解。你描述的算法是错误的 - 它没有考虑A和B各种索引的组合......见https://en.wikipedia.org/wiki/3SUM