我正在挑战有关三角数的问题。关键是要找出任意两个三角数之和是否等于输入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来更快地成功。

09-20 22:38