LeetCodeのゼロの組み合わせ(絶対に最も完全で、最も詳細で、穴は完全にスキップしました)
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で、結果が同じであることを説明してあるグループ を削除すべきである
質問:異種または用法が間違っている,[−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]の両者は完全に同じであり、直接集合でフィルタリングすることができる は追加前にソートされ、セットは同じ要素を自動的にフィルタします.
注意点:はリストを集合の要素として使用することはできません.集合はhash関数計算によって重み付けされるためですが、listはhash演算をサポートしない です.メタグループはhash演算をサポートする、対応する結果 になるまで、組合せをメタグループに変換して計算しなければならない.
プログラム3
構想分析:すべての組合せが遍歴し、最後の結果 に合致するか否かを判定する.結果に該当する場合は、順序を調整してから集合を入れる 調整順序:max(メタグループインスタンス)、min(メタグループインスタンス)、3つの和は0 である. max(タプルインスタンス)、0-max(タプルインスタンス)-min(タプルインスタンス)、min(タプルインスタンス)
タイトルの説明
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
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))
質問:
変更:
プログラム2
構想分析:
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))
注意点:
プログラム3
構想分析:
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))