問題の説明:
アレイNUMS N含む整数与えられ、それは、3つの要素例えば+ B + C = 0つまり、B、CのNUMSが存在するか否かを判断しますか?すべての条件が重複したトリプルを見つけることは満足していません。
注:答えは重複したトリプルを含めることはできません。
例:
所与のアレイNUMS = [-1、0、1、2、-1、-4]
会うようにトリプルの設定要件:
[
[-1、0、1]、
[-1、-1、2]
]
コード:
クラスソリューション: DEF threeSum(セルフ、NUMS): #配列の長さ のn = LEN(NUMS) IF(未 NUMS または N- <3。 ): リターン[] #最初のソート配列 nums.sort() #結果の保存 RES = [ ] #アレイを通して左から するための I におけるレンジ(N): #正数を横切るときに結果を返すことができる IF(NUMS [I]> 0): 復帰RES 位I> 0と、隣接する二つの値場合等しい、その後、継続 IFは、(I> 0 と NUMS [I] == NUMSは[I - 1。]): 続行 #次のIに左ポインタポイント = L I + 1。 #とアレイの右端に右ポインタは R&LT N- = - 1。 #ループ条件#コアはビットである場合、私は私は+ 1端に視点位置から、連続的に左ポインタ値のサイズ増加によって位3つの総和が0となるようにサイズおよび右ポインタ値を減少させるバランスのとれた位置を見つけるために、一方( L < R&LT): #これらの3つの数字が0まで追加した場合IF(NUMS [I] NUMS + [L] + NUMS [R&LT] == 0): #加算結果の res.append([NUMS [i]は、 NUMS [L]、NUMS [R&LT]) #この時点で、次のいずれかに左ポインタが決定され、それが同じであれば、右から左ポインタが継続しながら(L <R&LTを そして NUMS [L] == NUMS [L用+ 1 ]): L = L + 1。 #同様に、左と右のポインタが継続 しながら(Lを<R&LT 及び NUMS [R&LT] == NUMS [R&LT - 1。]): R&LT R&LT = - 1 #同一でない場合、左ポインタ直接右に L = L + 1。 #同一ではない場合、直接左右ポインタへの R&LT = R&LT - 1つのelif(NUMS [I]がNUMS + [L] + NUMS [ R&LT]> 0): #0より大きい場合は、左の及び右ポインタ R&LT = R&LT - 1。他: #は左ポインタ右、0以上であり、 L = L + 1 リターン RES
結果: