問題:
ソリューション:
クラスソリューション{ / * * * N NUMSを含む整数の配列を指定し、三つの要素は、C NUMSよう+ B + C = 0、Bが存在するか否かを判断しますか? *非繰り返しトリプレットを満たすためにすべての条件をご覧ください。 *ダブルポインタ方法、 *最初のソートNUMSアレイは、アレイをループ 右LEN =、補正後約2 NUM [I]を定義されている*、+ I =左1。1 * 1)NUMS [I]がゼロより大きい場合、その後、3つの数字を追加すると、ループは終了し、0より大きくなければならない * 2)NUMS [I] == NUMSは[iが場合 - 1] 、値が前に決定されたスキップ値を表し、 * 3)場合3その数は0に等しいとき、もしNUMS [左] ==のNUMS [左 + 1]、 右の値の結果を記録し、データ、スキップ値の重複をもたらすことができる * 4)は、3つの数とがあれば、0に等しい場合NUMS [右] == NUMS [右 - 1]、 、データの重複をスキップ値、左の記録の結果値を導くことができる * * @param NUMS * @return * / 公共のリスト<リスト<Integer型>> threeSum(INT [] NUMS){ リスト<リスト<Integer型>> RES = 新しい ArrayListを<> (); もし(NUMS == NULL || nums.length < 3 ){ 戻りRES。 } // 先将数组排序 クイック(NUMS、0、nums.length - 1 )。 // 双指针法 のために(int型 i = 0 ; iはnums.length && NUMSを[i]は<= < 0 ; iは++ ){ int型左= I + 1 。 int型、右= nums.length - 1 。 もし(I> 0 && NUMS [I] == NUMS [I - 1 ]){ 続けます。 } 一方(左< 右){ int型の和= NUMS [I] + NUMS [左] + NUMS [右]。 もし(合計== 0 ){ リスト <整数>リスト= 新規のArrayList <> (); list.add(NUMS [I])。 list.add(NUMS [左])。 list.add(NUMS [右])。 res.add(リスト); 一方(左<右&& NUMS [左] == + NUMS [LEFT 1]){ 左 ++ 。 } 一方(左<右&& NUMS [右] == NUMS [右- 1 ]){ 右 - 。 } 左 ++ 。 右 - ; } 他の 場合(和は、< 0 ){ 左 ++ 。 } 他{ 右 - 。 } } } リターン解像度; } / * * *快排NUMS数组 * * @paramのARRの * @paramの左 * @param右 * @return * / 公共 ボイドクイック(INT [] ARR、intです左、int型右){ // 递归终止条件 場合(左> 右){ 返します。 } int型の ベース =のARR [左]。 int型、L = 左。 int型の R = 右。 しばらく(!L = *R){ 一方(L <R && ARR [R]> = ベース){ R - 。 } 一方(lは<R && ARR [L] <= ベース){ L ++ 。 } 場合(L < R){ スワップ(ARR、R、L)。 } } スワップ(ARR、左、L)。 クイックソート(ARR、左、L - 1 )。 クイックソート(ARR、L + 1 、右)。 } / * * *交换两个数 * @paramのARR * @paramのR * @paramのL * / プライベート ボイドスワップ(INT [] ARR、int型の R、int型L){ int型の一時=のARR [R]。 ARR [R] =のARR [L]。 ARR [L] = TEMP。 } }