説明
四つの要素A、B、Cが存在する場合、整数と目標NUMS対象のN個の配列を指定し、そしてd NUMSは+ B + C + Dが目標の値に等しくなるように決定?クワッドの条件を満たし、繰り返さないすべて特定します。
注意:
答えは、重複したクワッドを含めることはできません。
例:
所与のアレイNUMS = [1、0、-1、0、-2、2]、および標的= 0。
ミート四タプルに設定要件:
[
[-1、0、0、1]、
[-2、-1、1、2]、
[-2、0、0、2]
]
解決
などが挙げられ、3つだけの数が、数は4つになります。マルチレイヤ循環。
まずソートし、比較します。最小値と最大値が決定さ一緒に、高速サイクルであってもよいことに留意されたいです。
コード
静的リスト<リスト<Integer型>> resList = 新しい ArrayListを<> (); パブリック 静的リスト<リスト<整数>> fourSum(INT [] NUMS、int型のターゲット){ 場合(ヌル == NUMS || nums.length <4 ){ 戻りresList。 } は、Arrays.sort(NUMS)。 int型の長さ= nums.length。 以下のために(INT I 0 =; I <= nums.length - 4; I ++ ){ 場合(I> 0 && NUMS [I] == NUMS [I - 1]){ // 相同的值不用再计算 続けます。 } のInt MINVAL NUMS = [I] + NUMS [I + 1] + NUMS [I + 2] + NUMS [I + 3 ]; IF(MINVAL>ターゲット){ // 最小値は、直接リターン目標より大きい BREAK ; } int型 NUMS = MAXVAL [I] NUMS + [長さ- 1] + NUMS [長-2] NUMS + [長さ- 3。]; IF(MAXVAL <ターゲット){ // 以下の最大のターゲットより、次のサイクルが 続行; } ため(INT。K = I + 1、K <= nums.length - 3が; K ++ ){ IF(K> I + 1 && NUMS [K] == NUMS [K - 1]){ // 同一の計算値は、もはや 継続しません; } MINVAL = NUMS [I] NUMS + [K] + NUMS + NUMS [K + 2 [K + 1] ]; IF(MINVAL>ターゲット){ // 最小値は、直接リターン目標より大きい BREAK ; } MAXVAL = NUMS [ I] NUMS + [K] + NUMS [長さ- 1] + NUMS [長-2。]; IF(MAXVAL <ターゲット){ // 以下の最大目標よりも、次のサイクルが 続行; } int型スタート= K + 1 、 INT nums.length =エンド- 1。; 一方(スタート< 完){ INTNUMS = nowRes [I] NUMS + [K] + NUMS [スタート] + NUMS [終了]; IF(ターゲット== nowRes){ resList.add(は、Arrays.asList(NUMS [I]、NUMS [K]、NUMS [スタート]、NUMS [終了])); 開始 ++ ; ながら(開始<エンド&& NUMS [開始] == NUMS [スタート- 1]){ // 同じ値ない再計算 開始++ ; } エンド - ; IF(スタート<エンド&& NUMS [終了] == NUMS [エンド+ 1]){ // 何も再計算が同じ値 end--ありません; } } そう であれば(ターゲット> nowRes){ 起動 ++ 。 } 他{ エンド - 。 } } } } 戻りresListと、 }