我正在挑战有关三角数的问题。关键是要找出任意两个三角数之和是否等于输入n。我可以使用它,但是显然它花费的时间太长,他们想要更快的速度。
按照我写的方式,它将所有三角形数字放入列表中,然后循环浏览列表以检查是否有任何一对数字符合条件。我不知道如何使循环更快,并且在这里阅读类似的帖子时,我不知道如何将其应用于这种情况。
这是代码:
def Triangular(n):
lst = []
for i in range(1, n + 1):
lst.append((i** 2 + i)//2)
yn = False
for i in lst:
for j in lst:
if i*i + j*j == n:
yn = True
break
else:
continue
return yn
最佳答案
将三角数的平方放入d̶i̶c̶t̶i̶o̶n̶a̶r̶y集(而不是列表)中。然后遍历d̶i̶c̶t̶i̶o̶n̶a̶r̶y集合,并为每个键询问该键是否小于或等于n/2
,并且n - key
还是该键集中的键。
这将是O(n log n)
最坏的情况,而不是O(n^2)
,而且速度明显更快。
当然,break
仅跳出循环的一个级别,因此您可以通过返回true来更快地成功。