给出五个排序列表:List1,List2,List3,List4,List5,每个长度为n。如果任何5(int)数字(每个列表1),总和为零返回true。我的目标是确保算法是O(n)。在我的脑海中,我可以想到用sum创建一个哈希映射 5个链表或评估5个列表,如[o(n * n * n * n * n)]。我期待着优化或降低复杂性的方法,而且我被卡住了。
我在Python中的代码:
def getIndicesFromFiveArrays(List1,List2,List3,List4,List5,t):
a,b,c,d,e=0,0,0,0,0
while(List1[a]+List2[b]+List3[c]+List4[d]+List5[e]!=t):
b=b+1
if b==len(List2):
return (-1,-1)
if List1[a]+List2[b]+List3[c]+List4[d]+List5[e]<t:
a=a+1
b=b-1
c=c-1
d=d-1
e=e-1
if a==len(List1):
return (-1,-1)
return (a,b,c,d,e)
编辑1:顺便说一下,这不是功课,你可以查看我的其他问题并自己验证。感谢..
答案 0 :(得分:2)
有一个O(n ^ 3)解决方案,受到MRAB评论的启发。
首先,将列表1中的每个值与列表2中的每个值组合并将其存储在一个集合中。调用结果集1和2,它有n ^ 2个值。
接下来,将集合1和2与列表3组合。调用结果集1and2and3,它具有n ^ 3个值,并且需要n ^ 3个步骤来构造。
接下来,组合列表4和5.调用结果集4和5,它具有n ^ 2个值。
最后,检查集合4和5中的任何值是否等于集合1and2and3中的值的倒数。这一步需要n ^ 2步。
这种方法使用O(n ^ 3)空间和O(n ^ 3)时间。
正如Karoly Horvath指出的那样,你实际上并不需要存储集合1和2和3,你可以在最后一步中从集合1和2中动态构建它。此方法仅使用O(n ^ 2)空间,但仍需要O(n ^ 3)时间。这是代码:
l1 = [1,2,3,4,5,10]
l2 = [1,2,3,4,5,11]
l3 = [1,2,3,4,5,12]
l4 = [1,2,3,4,5,13]
l5 = [1,2,3,4,5,-46]
def test():
l1_2 = [a + b for a in l1 for b in l2]
set4_5 = set([a + b for a in l4 for b in l5])
return any([True for x in l1_2 for y in l3 if -(x + y) in set4_5])
print test()
答案 1 :(得分:0)
如果有2个列表,则从列表1中取一个数字,然后在列表2中查找该数字的负数。如果用一个集替换了列表2,则总体复杂度为O(n)。 / p>
如果有3个列表,您将从列表1中获取一个数字,然后从列表2中获取一个数字,复杂度为O(n ^ 2)。如果用集合替换列表3,则总体复杂度将为O(n ^ 2)。
所以我认为5个列表/集合的整体复杂性不能低于O(n ^ 4)。