给出三个列表:A,B和C,每个长度为n。如果任何3个三个数字(每个列表1个),总和为零返回true。我想用o(n)复杂度来解决这个问题。我已经对列表进行了排序,我可以想到创建一个总和为2的哈希映射链接列表或将3个列表一起比较[o(n * n * n)]。建议一些方法来即兴发挥方法以降低复杂性......我想不出任何......谢谢你的推荐
答案 0 :(得分:7)
列表已排序,对吗?在O( n )时间内从 C 中构建一个排序数组 C'。
对于每个 n ²对 x , a y A × B ,检查 - ( x + y )是否在二元搜索的 C'中。总时间复杂度为O( n ²lg n ),空间复杂度为O( n )。
从 C 中构建哈希表会使时间复杂度进一步降低到O( n ²),代价是相信O(1)哈希表。
答案 1 :(得分:5)
我认为o(n²)
(即更好而不是n²
)是不可能的,但可以在O(n²)
中完成(即......如n²
)如下:
首先,反向列表B
获取B'
(花费O(n)
次),这是一个项目按降序排序的列表。首先,我们考虑在列表A
和B'
中找到两个与任何给定数字相加的元素的问题:
我们可以像下面这样(Python代码):
def getIndicesFromTwoArrays(A,B,t):
a,b=0,0
while(A[a]+B[b]!=t):
b=b+1
if b==len(B):
return (-1,-1)
if A[a]+B[b]<t:
a=a+1
b=b-1
if a==len(A):
return (-1,-1)
return (a,b)
以上的运行时间为O(n)
。所需的额外空间是O(1)
,因为我们只需要存储两个指针。请注意,上述内容可以轻松转换,以便与双向链表一起使用。
然后,总的来说我们必须做以下事情:
def test(A,B,C):
B.reverse()
for c in C:
if getIndicesFromTwoArrays(A, B, c) != (-1,-1):
return True
return False
这会导致运行时间O(n²)
和额外空间O(1)
。
答案 2 :(得分:0)
你不能用O(n)复杂度做到这一点,因为它是NP完全问题(除非P = NP)。查看Wiki page about Subset Sum problem以获取可能的解决方案。