我正在对三角数进行挑战。关键是要弄清楚任何两个三角数的和是否等于输入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
答案 0 :(得分:3)
将三角形数字的正方形放入d̶i̶c̶t̶i̶o̶n̶a̶r̶y集合(不是列表)。然后浏览d̶i̶c̶t̶i̶̶̶̶̶̶̶̶,并为每个密钥,询问密钥是否小于或等于n/2
,并且n - key
是否也是l̶i̶s̶t集合中的密钥。
最差的情况是O(n log n)
,而不是O(n^2)
,而且明显更快。
当然,break
只会突破循环的一个级别,所以通过返回true可以更快地成功。