使用python在列表中查找毕达哥拉斯三元组的数量?

使用python在列表中查找毕达哥拉斯三元组的数量?,python,computer-science,pythagorean,Python,Computer Science,Pythagorean,我正在为一个问题编写一个解决方案,其中代码将在给定列表a的列表中查找毕达哥拉斯三元组的数量。然而,当我向自动分级机提交代码时,有一些测试用例我的代码失败了,但我不知道出了什么问题。请帮我指出我的错误 def Q3(a): lst = [i ** 2 for i in a] lst.sort() ans = 0 for x in lst: for y in lst: if (x + y) in lst:

我正在为一个问题编写一个解决方案,其中代码将在给定列表a的列表中查找毕达哥拉斯三元组的数量。然而,当我向自动分级机提交代码时,有一些测试用例我的代码失败了,但我不知道出了什么问题。请帮我指出我的错误

def Q3(a):
    lst = [i ** 2 for i in a]
    lst.sort()
    ans = 0

    for x in lst:
        for y in lst:
            if (x + y) in lst:
                ans += 1

    return ans // 2
“勾股三元组”是勾股定理的整数解,例如,32+42=52。给出一个正整数列表,求毕达哥拉斯三胞胎的数目。如果至少有一个整数不同,则两个毕达哥拉斯三元组是不同的

实施

·实现一个函数Q3(a),其中a是一个正整数列表。列表A的大小最多为250

·列表A中没有重复项

·此函数返回勾股函数的三元组数

样品

·Q3([3,4,6,5])=1


·问题3([4,5,6])=0

问题1:假设您的输入是

[3,4,5,5,5]
虽然你的问题有点不清楚,但我的假设是这应该算作三个蟒蛇式的三元组,每一个都使用三个5中的一个

您的函数将只返回1

问题2:正如Sayse所指出的,您的“三元组”可能试图使用相同的数字两次

您最好使用
itertools.combinations
从正方形列表中获得不同的组合,并计算出现了多少合适的三元组

from itertools import combinations

def Q3(a):
    squares = [i**2 for i in a]
    squares.sort()
    ans = 0

    for x,y,z in combinations(squares, 3):
        if x + y == z:
            ans += 1

    return ans

考虑到您现在通过编辑添加到问题中的输入的限制,我认为您的实现在逻辑上没有任何问题。代码可能无法通过的唯一测试用例类型必须与性能相关,因为您使用的是最慢的解决方案之一,使用3个嵌套循环在列表的整个范围内迭代(在操作符中的
本身是通过循环实现的)

由于列表已排序,并且我们需要
x
,因此我们应该使
y
x+1
开始,并使
z
y+1
开始。由于给定一个
x
x
的值取决于
y
的值,对于每个给定的
y
,我们可以增加
z
,直到
z*z
不再成立,如果
z*z==x*x+y*y
在那一点,我们找到了一个毕达哥拉斯三元组。这允许
y
z
仅扫描
x
上面的值一次,因此将时间复杂度从O(n^3)降低到O(n^2),使列表大小为250时的速度提高约40倍:

def Q3(a):
    lst = [i * i for i in sorted(a)]
    ans = 0
    for x in range(len(lst) - 2):
        y = x + 1
        z = y + 1
        while z < len(lst):
            while z < len(lst) and lst[z] < lst[x] + lst[y]:
                z += 1
            if z < len(lst) and lst[z] == lst[x] + lst[y]:
                ans += 1
            y += 1
    return ans
def Q3(a):
lst=[i*i表示排序后的i(a)]
ans=0
对于范围内的x(透镜(lst)-2):
y=x+1
z=y+1
当z
简单但不是很有效的解决方案是在3个嵌套的for循环中循环遍历范围内的数字列表(例如,我已将数字从1到100)。但是对于100个元素,它的速度会慢一些,它需要有100^3个操作

triplets = []
for base in range(1,101):
    for height in range(1,101):
        for hypotenuse in range(1,101):
            # check if forms a triplet

            if hypotenuse**2 == base**2 + height**2:
                triplets.append(base, height, hypotenuse)
这可以稍微提高效率(有更好的解决方案) 通过计算每个底面和高度组合的斜边,然后检查斜边是否为整数

    triplets = []
    for base in range(1,101):
        for height in range(1,101):
            hypotenuse = math.sqrt(base**2 + height**2)
            # check if hypotenuse is integer by ramiander division by 1                    
            if hypotenuse%1==0:
                triplets.append(base, height, hypotenuse)  
                 

# the above solution written a list comprehension
a = range(1,101)
[(i,j,math.sqrt(i*i+j*j)) for i in a for j in a if math.sqrt(i*i+j*j)%1==0]

如果你认为(3,4,5)和(3,5,4)是不同的,那么使用一个集合而不是列表,在最后的

中得到LeN(三重集)。在<代码> [3,4,5,5,5] < /代码>中,有多少个PythGrORE三元组?你的函数会说有多少个?你在相同的范围内迭代,因此x和y可能都是相同的元素我已经用一个解决方案更新了我的答案,该解决方案应该通过测试用例,前提是它们与性能相关。