件名の説明:
配列NUMS nは、整数を含む所定のは、3つの要素は、C NUMSよう+ B + C = 0、Bが存在するか否かを判断しますか?すべての条件が重複したトリプルを見つけることは満足していません。
注意:答えは重複したトリプルを含めることはできません。
例えば、アレイのNUMS = [-1、0、1、2、-1、-4]を与え
トリプルのセットの要件を満たす:
[
[-1、0、1]、
[-1、-1、2]
]
トピック分析:
まず、アレイ(の時間複雑ソートO(nlog (N))[i]は、図はNUMS [L]であった[I] NUMSの左右後端にポインタを使用し、その後、ソート)、固定数のNUMSおよびNUMS [R]、及び和が計算されるが、3個の数字0を満たすと判定され、結果セットに追加満たされ
NUMS [i]が0より大きい場合、3の合計はサイクルを終了、0に必ずしも等しくすることができない場合
NUMS場合は[I] = = NUMSは[I-1]、それは数が繰り返され、その結果が繰り返され、それがスキップされるべきであることを示す
NUMS [L] == NUMS [場合、場合和== 0 L + 1] の結果を複製するために導くことができる、ジャンプすべきです郭、L ++
SUM0、NUMS [R] = NUMS [R-1]は、r--のスキップしなければならない、結果を複製につながる可能性
はO(n ^ 2):時間の複雑さを Nは配列の長さであります
コードの実装:
パッケージcom.company。 輸入はjava.util.ArrayList; 輸入java.util.Arrays。 輸入はjava.util.List; パブリッククラスメイン{ パブリック静的無効メイン(文字列[] args){ [] INT NUMS =新しいINT [] { - 1、0、1、2、-1、-4}。 System.out.println(threeSum(NUMS))。 } プライベート静的リスト<リスト<整数>> threeSum(INT [] NUMS){ リスト<リスト<整数>>結果=新規のArrayList <>(); IF(NUMS == NULL || nums.length <3){ リターン結果。 } は、Arrays.sort(NUMS)。 以下のために(INT i = 0; iは<nums.length; iは++){ IF(NUMS [I]> 0){ 破ります。 (I> 0 && NUMS [I] == NUMS [I - 1])であれば{ 続けます。 } int型の左= I + 1。 int型rigth = nums.length - 1。 {(<右左)一方、 [I] INT合計= NUMS [左] + NUMS [rigth] + NUMS。 IF(和== 0){ result.add(は、Arrays.asList(NUMS [I]、NUMS [左]、NUMS [rigth]))。 一方(左<rigth && NUMS [左] == NUMS [左+ 1]){ ++左。 } 一方(左<rigth && NUMS [rigth] == NUMS [rigth - 1]){ rigth--。 } ++左; rigth--; 他の場合}(合計が<0){ ++左。 }他{ rigth--。 } } } 戻り値の結果; } }
時間計算量:O(^ N-2) 、N- 配列の長さ
宇宙複雑:O(1)、保存するための一定のスペース