2016-04-12 12 views
1

三角形の数字について挑戦しています。ポイントは、三角形の数字のいずれか2つの合計が入力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

_質問: "三角形の数字のうちの2つの合計**が入力nと等しいかどうかを調べることが重要です" _ - なぜコードが見えるのですか**四角形の合計**で? – Eric

+0

私は – JonnyDoeInWisco

答えて

3

辞書セット(ないリスト)に三角数の二乗を置きます。次に、d -i -c -t -i -n -a -r -yの設定を行って、各キーについて、キーがn/2以下であるかどうか、n - keyがl -i-s-tセットのキーであるかどうかを尋ねます。

O(n^2)の代わりにO(n log n)ワーストケースであり、はるかに高速です。

もちろん、breakはループの1つのレベルから外れるだけです。したがって、trueを返すことでより早く成功することができます。

+0

それは、真実を返すだけでさえ、そうだったでしょう。私は何を考えていたのか分からず、助けてくれてありがとう。 – JonnyDoeInWisco

+0

辞書の中に置かれた場合、文「if <=(n/2)and(n-i)in lst」が条件をどのように満たしているか理解していませんか?ユーザーのケースはn = 2であり、結果は技術的にFalseでなければなりません。 – Adib

+0

'set'の何が問題なのですか? BTW inはdictに対してO(1)であり、これをO(n)にする必要がありますか? – AChampion