设A,B,C为3个n元素阵列。找到一个算法,用于确定A中是否存在a
,B中为b
,C中为c
,a+b+c = k
。
我尝试过以下算法,但需要O(n²)
:
对所有3个数组进行排序。 - O(n log n)
临时数组h = k - (a+b)
- O(n)
对于每个h
,请在B中找到c'
,c' = h - B[i]
- O(n)
使用二分搜索在C中搜索c'
- O(log n)
总计= O(n log n) + O(n) + O(n² log n)
我们可以在O(n log n)
解决吗?
答案 0 :(得分:5)
假设在S
时间内存在针对此问题的解决方案O(n lg n)
。
我将展示3SUM的任何实例,其长度为n
,线性时间数组会减少您的问题。
给定一个长度为s
的数组n
的3SUM实例,定义数组A = B = C = s
,O(n)
操作。使用S(A, B, C, 0)
分别确定数组a,b,c
是否存在索引A,B,C
,A[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