使用python在列表中查找毕达哥拉斯三元组的数量?
我正在为一个问题编写一个解决方案,其中代码将在给定列表a的列表中查找毕达哥拉斯三元组的数量。然而,当我向自动分级机提交代码时,有一些测试用例我的代码失败了,但我不知道出了什么问题。请帮我指出我的错误使用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:
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可能都是相同的元素我已经用一个解决方案更新了我的答案,该解决方案应该通过测试用例,前提是它们与性能相关。