我有一个带有正整数的有序列表(从0到200万随机选择),我需要找到符合这个条件的可能三元组的数量: 第二个和第一个之间的差异等于第三个和第二个之间的差异。换句话说,这里是有序三元组:(x,y,z),我需要:y-x = z-y。一个必要条件是问题在 O(n)或O(n * logn)中自行解决。
可能的差异数量是未知的,如果存在三元组。
例如这里是一个例子:list是[1,3,4,7,9,10,11] 有4个明显的差异,但1个给出2个不同的三元组,所以5个三元组总共有一个中间。
三胞胎,差异
[1,4,7] 3
[4,7,10] 3
[3,7,11] 4
[7,9,11] 2
[9,10,11] 1
所以我虽然使用了一个简单的算法( O(n ^ 2)),但它需要花费太多时间: (maxi几乎就像列表的最大值)
c=set(lst)
count=0
for i in range(len(lst)):
flag=1
k=i+1
while k<len(lst) and flag:
e=lst[k]
diff = e - lst[i]
if diff * 2 > maxi:
flag = 0
if (e + diff) in c:
count += 1
k+=1
print(count)
响应此问题的完整算法的repl:https://prologin.org/train/2018/qualification/crepes_parfaites https://repl.it/@elisafirenzoe/SecondSuspiciousFalcon
我想到了其他解决方案,例如使用AVL或散列图,但由于未知的差异,我无法弄清楚所有的三元组,我查看了子集求和问题,但它似乎没有响应我的请求
有趣,但不确定如何应用它,因为我不知道哪些元素将成为中间:https://en.wikipedia.org/wiki/3SUM