python - 给定一个包含多个元素的列表,如何获得完美三元组的数量?

标签 python algorithm list

我正在尝试解决一个编程问题,给定一个整数列表,找出完美三元组 [x, y, z] 的数量,其中 y % x == 0 和z % y == 0

例如,[1, 2, 3, 4, 5, 6] 有三元组:[1, 2, 4], [1 , 2, 6], [1, 3, 6], 使答案总数为 3.

这是我目前所拥有的:

def solution(l):
    l.sort()
    l.reverse()
    l_size = len(l)
    count = 0

    if len(l) < 3:
        return count

    for i in xrange(len(l) - 2):
        for j in xrange(i + 1, len(l) - 1):
            if l[i] % l[j] == 0:
                for k in xrange(j + 1, len(l)):
                    if l[j] % l[k] == 0:
                        count += 1

    return count

我的解决方案的问题是 l 的长度可能在 2 到 2000 之间(含)。所以对于较长的输入来说需要很长时间。

最佳答案

如果您只需要一个计数而不是实际的三元组,您可以在 O(n^2) 时间内完成。首先创建一个列表,指示列表中有多少其他数字可以平均分配该数字。这需要 O(n^2) 时间。

然后从最大开始迭代数字以找到所有 zy 对,并为每一对添加创建列表中 y 的值在结果的第一步。这也需要 O(n^2) 时间。

def solution(l):
    divs = [0] * len(l)

    for i in range(len(l)):
        for j in range(i + 1, len(l)):
            if l[j] % l[i] == 0:
                divs[j] += 1

    result = 0
    for i in range(len(l) - 1, 1, -1):
        for j in range(i - 1, 0, -1):
            if l[i] % l[j] == 0:
                result += divs[j]

    return result

print(solution([1, 2, 3, 4, 5, 6]))
print(solution(list(range(1, 2000))))

输出:

3
40777

更新这是另一种一次性处理列表的解决方案:

def solution2(l):
    divs = [[0, 0] for _ in l]

    for i in range(len(l)):
        for j in range(i + 1, len(l)):
            if l[j] % l[i] == 0:
                divs[j][0] += 1
                divs[j][1] += divs[i][0]

    return sum(x[1] for x in divs)

关于python - 给定一个包含多个元素的列表,如何获得完美三元组的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42083068/

相关文章:

c++ - 顶点着色器的定点算法

c - 通过引用传递 C 指针?

java - 将excel的内容写入文本文件

python - 检查列表中是否有多个项目的最简单方法?

python - 为什么我的简单 pygame 会滞后?

javascript - 没有递归函数调用的排列

arrays - 如何在protobuf重复字段中发送0?

Python sklearn : oneclassSVM never converges

python - 我正在尝试使用python中的TCP创建客户端服务器模型以进行文件共享。

python - 如何在文本文件中找到最相关的字符串?