タイトル説明
あなたN NUMSを含む整数の配列を得、それは、3つの要素NUMSよう+ B + C = 0 C、A、Bが存在するか否かを判断しますか?あなたはすべての重複のトリプルを見つけるの条件を満たさないでください。
注:答えは重複したトリプルを含めることはできません。
例:
所与のアレイNUMS = [-1、0、1 、2、-1、-4]、
のようなトリプルのセットの要件を満たす:
[
[-1、0、1]、
[-1、-1、2]
]
Pythonコード
+ダブルポインタの並べ替え
問題の難しさは、重複した溶液を除去する方法です。
アルゴリズム的プロセス:
1.日本語文、配列の長さのためにNN、またはアレイは[]に戻り、以下33の配列nullnull長である場合。
2.ソート配列。
3.トラバースは、配列をソート:
もしNUMS [I]> 0nums [I ]> 0: 同様にソートするので、そこに3に等しいこととの数プラス00は、直接結果を返すことができません。
要素を繰り返す:避ける重複溶液に、スキップ
左ポインタL = I + 1L = I +するために 1、 および右ポインタR = N-1R = N- 1、 :L <RL <R、実行サイクル
NUMSを[ I] + NUMS [L] + NUMS [R] == 0nums [I] + NUMS [L] + NUMS [R] == 0、 実行サイクル、それは左境界と右境界位置と次の反復か否かを判断する、重複排除ソリューション。そして、同時にL、RL、次の位置にRは、新しいソリューションを探し
NUMS [R] NUMS示す場合よりも大きい00 [R]は、RRも大きいままである
場合未満00記載NUMS [L] NUMS [ L]が小さすぎると、LLの右
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
ans = []
nums.sort()
n = len(nums)
for i in range(n):
if nums[i]>0:
return ans
if (i>0 and nums[i]==nums[i-1]):
continue
L = i + 1
R = n - 1
while(L<R):
if nums[i]+nums[L]+nums[R]==0:
sub_ans = [nums[i], nums[L], nums[R]]
sub_ans.sort()
ans.append(sub_ans)
while(L<R and nums[L]==nums[L+1]):
L += 1
while(L<R and nums[R]==nums[R-1]):
R -= 1
L +=1
R -=1
elif nums[i]+nums[L]+nums[R]>0:
R -= 1
else:
L += 1
return ans