トピック1:
配列NUMS nは、整数を含む所定のは、3つの要素は、C NUMSよう+ B + C = 0、Bが存在するか否かを判断しますか?すべての条件が重複したトリプルを見つけることは満足していません。
注意:答えは重複したトリプルを含めることはできません。
例えば、アレイのNUMS = [-1、0、1、2、-1、-4]を与え
トリプルのセットの要件を満たす:
[
[-1、0、1]、
[-1、-1、2]
]
分析:これは三重の加算の問題です
図1に示すように、最初に定義されたタプルを返すタイプ、リスト<リスト<整数>>新しい新しいANS =のArrayList <>() ;
2、の先頭ソートする配列、は、Arrays.sort(NUMS)。
以下のための全体の配列へのポインタが横断3、(I = 0 int型、iがnum.lenghtを<; I ++)は
図4は、次に設定それぞれ、二つのポインタを1 + I = L ,. 1-LEN = R&LTを。 ;
図5に示すように、次の開始和が判定され、IF(NUMS [I] + NUMS [L] + NUMS [R] == 0)+ +1に、r--の。
図6に示すように、当然のことながら、内に堆積されるべきである(は、Arrays.asList(NUMS [I]、NUMS [L]、NUMS [R&ans.add LT])) 。
図7に示すように、このプロセスで製造するために繰り返すことができる、IF(NUMS [I]> (I> && NUMS [I] == NUMSは[I-1])が続く場合、0)ブレーク;(NUMS [L] == NUMS [Lながら+1])L ++;同じ; R
8、もし異なる和<0、L ++;和> 0、r--の。
9、ANSを返します。
特定のコード:
クラスソリューション{ パブリックリスト<リスト<整数>> threeSum(INT [] NUMS){ リスト <リスト<整数>> ANS = 新規のArrayList <> (); int型のlen = nums.length。 もし(NUMS == NULL || LEN <3)戻りANS。 Arrays.sort(NUMS)。 以下のために(int型 i = 0; iがLEN <; iは++ ) { int型 L = I + 1、R = LEN-1 。 もし(NUMS [i]が> 0)破ります。 もし(I> 0 && NUMS [I] == NUMS [I-1])続行; 一方、(L < R) { int型の和= NUMS [I] + NUMS [L] + NUMS [R]。 もし(合計== 0 ) { ans.add(は、Arrays.asList(NUMS [I]、NUMS [L]、NUMS [R])); 一方、(L <R && NUMS [L] == NUMS [L + 1])L ++ 。 一方、(L <R && NUMS [R] == NUMS [R-1])r--の。 L ++ ; R - ; } そう であれば(合計<0)L ++ 。 それ以外の 場合(合計> 0)r--の。 } } 戻り年。 } }