【LeetCode] 18☆☆☆4及び(ダブルポインタ)の数

四及び数

説明

四つの要素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と、
    }

 

おすすめ

転載: www.cnblogs.com/fanguangdexiaoyuer/p/12160664.html
おすすめ