LeetCodeのゼロの組み合わせ(絶対に最も完全で、最も詳細で、穴は完全にスキップしました)

15928 ワード

LeetCodeのゼロの組み合わせ
タイトルの説明
0の組み合わせ(10点)テーマ内容:
いくつかの整数(重複整数が存在する可能性がある)を含むリストを与え、a+b+c=0?が条件を満たし、重複しない3つの要素a,b,cが存在するかどうかを判断する.
入力形式:
同じ行で、リスト内の要素はスペースで区切られています.
出力フォーマット:
共1行、重複しない組み合わせの個数で、このような組み合わせが存在しない場合は0を出力する
サンプルを入力:
-1 0 1 2 -1
出力サンプル:
2
(注:2つの組み合わせは-1,-1,2,-1,0,1)
注意点
  • に与えられた数字は繰り返し可能であり、与えられた数字は1,1,-2,0,0,
  • である.
  • の組み合わせは繰り返してはいけない、すなわち[1,-1,2]および[2,-1,1]は、繰り返しとみなされ、
  • を削除すべきである.
    プログラム1
  • 構想分析*すべてのリストの中のすべての三元グループを遍歴し、漏れない:3つのネストループ、内層は外層を起点とする*重み付けを行う:毎回追加するたびに、結果の中のすべての組み合わせと異或演算を行い、結果は0で、結果が同じであることを説明してあるグループ
  • を削除すべきである
    alist = list(map(int,input().split()))
    res = list()
    for i in range(0,len(alist)):
        for j in range(i+1,len(alist)):
            for k in range(j+1,len(alist)):
                if alist[i] + alist[j] + alist[k] == 0:
                    res.append([alist[i], alist[j], alist[k]])
                    for m in range(0,len(res)):
                        for n in range(m+1,len(res)):
                            if res[m][0]^res[m][1]^res[m][2]^\
                                    res[n][0]^res[n][1]^res[n][2] == 0:
                                res.remove(res[m])
    print(res)
    print(len(res))
    

    質問:
  • 異種または用法が間違っている,[−1,2,−1],[1,−1,0]と,互いに異種の結果は0であるが,実際には両者は異なる
  • である.
  • 排他的アルゴリズムは、排他的適合条件を判定するために使用される.
  • 偶数の数字で、すべての数字はゼロではありません.
  • 奇数個の数字は調合されて0になることができるが、実際には必ずしも同じ数があるとは限らない.14,9,7の3つの数字が異なるか、0
  • の結果になります.
  • ゼロ異または任意の数は0であり、0^0かゼロかに注意してください.


  • 変更:
  • は、処理
  • を単独でリストするため、何の意味もない.
    プログラム2
    構想分析:
  • リストが順序付けされている場合、同じ組み合わせでグループ内の順序は必ず一致する:[1,-1,0]と[1,0,-1]であり、順序付けに基づいて追加すると[-1,0 1]と[-1,0,1]の両者は完全に同じであり、直接集合でフィルタリングすることができる
  • は追加前にソートされ、セットは同じ要素を自動的にフィルタします.
  • alist = sorted(list(map(int,input().split())))
    res = set()
    for i in range(0,len(alist)):
        for j in range(i+1,len(alist)):
            for k in range(j+1,len(alist)):
                if alist[i] + alist[j] + alist[k] == 0:
                    res.add((alist[i],alist[j],alist[k]))
    print(res)
    print(len(res))
    

    注意点:
  • はリストを集合の要素として使用することはできません.集合はhash関数計算によって重み付けされるためですが、listはhash演算をサポートしない
  • です.
  • メタグループはhash演算をサポートする、対応する結果
  • になるまで、組合せをメタグループに変換して計算しなければならない.
    プログラム3
    構想分析:
  • すべての組合せが遍歴し、最後の結果
  • に合致するか否かを判定する.
  • 結果に該当する場合は、順序を調整してから集合を入れる
  • 調整順序:max(メタグループインスタンス)、min(メタグループインスタンス)、3つの和は0
  • である.
  • max(タプルインスタンス)、0-max(タプルインスタンス)-min(タプルインスタンス)、min(タプルインスタンス)
  • alist = list(map(int,input().split()))
    res = set()
    for x in range(len(m)-2):
        for y in range(x+1,len(m)-1):
            for z in range(y+1,len(m)):
                v = (m[x],m[y],m[z])
                if sum(v) == 0:
                    res.add((max(v),0-max(v)-min(v),min(v)))
    print(res)
    print(len(res))