2016-04-12 57 views
1

我正在做三角形数字的挑战。重点是要找出任何两个三角形数字的总和是否等于输入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

您可能要问[codereview.se] – zondo

+0

_“关键是要弄清楚任何两个三角形数字的** sum **是否等于输入n”_ - 那么为什么你的代码看起来像**的平方**的总和? – Eric

+0

因为我输错了 – JonnyDoeInWisco

回答

3

平方三角数在字典中设置(不是列表)。然后通过d̶i̶c̶t̶i̶o̶n̶a̶r̶y集和每个密钥,询问密钥是否小于或等于n/2以及n - key是否也是密钥集中的密钥。

这将是O(n log n)最糟糕的情况,而不是O(n^2),并显着更快。

当然,break只打破了循环的一个级别,所以通过返回true可以更快地成功。

+0

就是这样,即使只是回归真实。我不知道我在想什么,谢谢你的帮助。 – JonnyDoeInWisco

+0

我不明白如果在lst'中如果我<=(n/2)和(n-i)语句如果放在字典中是如何满足条件的?用户案例是n = 2,结果在技术上应该是False。 – Adib

+0

'set'有什么问题?顺便说一句'是'O(1)的字典和设置,所以这只是O(N)? – AChampion