计算在O(n *常数)中有序列表中的中间值(例如,第二个第一个=第三个 - 秒)的三元组的数量

时间:2018-01-05 16:32:30

标签: python algorithm complexity-theory

我有一个带有正整数的有序列表(从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

0 个答案:

没有答案