我写了这个程序输出毕达哥拉斯三元组,其总和是一定数量(这将是参数)。该程序运行完美,但同一个三元组出现多次,我希望一个三元组只出现一次。我想知道是否有人可以帮助我。谢谢!
def pythagoreanCheck(tripletList):
'''
Checks whether the three numbers are pythagorean triplet
returns True or False
'''
trip_list = [0,1,2]
if tripletList[0]**2 + tripletList[1]**2 == tripletList[2]**2:
return True
else:
return False
def givMeSum(target):
'''
returns 3 numbers such that their sum is equal to target
'''
listOfa = xrange(1,target)
listOfb = xrange(1,target)
listOfc = xrange(1,target)
for i in listOfa:
for j in listOfb:
for k in listOfc:
add = i + j + k
if add == target:
add_list = [i,j,k]
add_list.sort()
value = pythagoreanCheck(add_list)
if value:
print add_list
def main():
givMeSum(12)
main()
答案 0 :(得分:1)
这是因为你在嵌套列表中进行计算,然后创建一个由3个相同数字的不同排列组成的排序列表。
由于i,j和k将三次输入相同三个数字的不同组合,因此每次添加将等于目标,这意味着add_list被创建并排序3次。这意味着它将创建相同的列表3次。
我认为你应该拿出
add_list.sort()
Siddharth是对的,你的算法效率很低。您将其转换为O(n ^ 3)算法,这可能需要很长时间才能获得更大的目标数。
答案 1 :(得分:0)
考虑将每个元组存储在哈希表(字典)中,而不是在最里面的循环中打印它。在所有循环完成结束时,打印散列中的所有值。
除了你的问题,你可以通过创建一个整数哈希并用哈希搜索替换最里面的循环来使算法更快。
答案 2 :(得分:0)
您需要确保i <= j <= k
:
def pythagoreanCheck(tripletList):
'''
Checks whether the three numbers are pythagorean triplet
returns True or False
'''
a, b, c = tripletList
return a**2 + b**2 == c**2
def givMeSum(target):
'''
returns 3 numbers such that their sum is equal to target
'''
for i in xrange(1, target):
for j in xrange(i, target): # j >= i
for k in xrange(j, target): # k >= j
if i + j + k == target:
add_list = [i, j, k] # no need to sort any more
if pythagoreanCheck(add_list):
print add_list
def main():
givMeSum(12)
main()
如上所述,这种算法远非最优,但至少可以解决您所看到的问题。
这是一种稍微好一点的方法(两个嵌套循环而不是三个):
def giveMeSum(target):
'''
returns 3 numbers such that their sum is equal to target
'''
for i in xrange(1, target):
for j in xrange(i, target):
k = target - i - j
if k < j:
break # skip to the next value of i - all remaining js are too big
add_list = [i, j, k]
if pythagoreanCheck(add_list):
print add_list