Leetcodeブラシのタイトルは--n和問題を指摘します

2Sum;

件名の説明:

整数配列、ターゲットは、アレイから、Bを見つけるNUMS、例えば+ B =目標ことを考えると、条件満足するだけつのアレイ、Bを想定

オリジナルのアイデア:

結果を見つけるために配列をループするための二つが、時間複雑度はO(N 2

最適化のアイデア:

キーと値のペアは、<[i]は、私NUMS>、HashMapの<整数、整数>マップを確立するために、ハッシュテーブルを使用します。各カウントNUMS [I]の配列NUMSを介して、記録対象-NUMS [I]と同じキーが場合であり、その場合、クエリハッシュテーブルを見つけ、それ以外の場合は、NUM [i]と添字I格納されたハッシュテーブル。ハッシュテーブルルックアップ時間複雑度は、(1)Oとして見ることができるので、アルゴリズムの時間複雑度はO(N)Aに低減されるからです。

 

3Sum:

件名の説明:

、アレイから[C、B]は、すべて別個を見つけるために、整数のアレイNUMSを与えよう+ B + C = 0であります

オリジナルのアイデア:

循環のための3が、残業

最適化のアイデア:

ダブルポインタ。まず、(重複を防止するために)、次いで、各位置iにおけるアレイを横切る配列をソート、ダブルポインタは、位置I + 1、および場所に右ポインタが指す左ポインタポイントが設けられているnums.length-1、および場合、三つの位置の和を計算します、標準的な加算結果セットのその後数3位置、0に等しい左側と右側、左側と右側で、0よりも大きい場合には、左右のポインタ; 0より小さい場合には、左と右、左、右ポインタ満たされるまで。エンド反復では、[c、a、b]は、すべての資格を検索します。ポインタは、上部に等しい数の位置に移動した場合、重複する結果を防ぐために、低い位置の数字は、一つは移動し続けます。この方法の時間計算量はO(N-制御することができる2)。

 

3SumClosest:

件名の説明:

NUMS整数配列、標的、およびアレイから識別するための番号3の和、所与のように最小目標との差の絶対値の和

アイデア:

そして3Sum同様に、二重のポインタを使用します。

 

4Sum;

件名の説明:

NUMS指定された整数配列、標的は、配列からのすべての四級配列[A、B、C、D]を、見つけるために繰り返されないよう+​​ B + C + D =目標その

アイデア:

分解、次いで2Sum、2Sumハッシュマップまたは二重ポインタに分解3Sum 4Sumに分解を(N Oの時間複雑性を制御するために使用することができる。3)。実際のコードの実装は、重複を避けるため、そして決意条件のいくつかを使用することができる(例えば:配列が昇順であるため、現在のNUMSは[i]が* 4>ターゲット場合 、 ブレークは直接であってもよい)の速度のために最適化。

特定の実装:

リストパブリック<リスト<整数>> fourSum(INT [] NUMS、INT対象){ 
リスト<リスト<整数>>新しい新しいRES =のArrayList <>();
//配列が空または長さで戻り、4未満である
(NUMS IF =ヌル|| nums.length = <4)
リターンRES;
//ソート
;は、Arrays.sort(NUMS)
//配列が大きすぎるか小さすぎる配列であり、戻り
(NUMS [0] * 4あれば目標|| NUMS [NUMS>。 1長] * 4 <ターゲット)戻りRESは、。

ため(I = 0 int型; Iを<-nums.length 3; Iは++){
//決意条件がNUMSないことに留意されたい[I + 1] == NUMS [i]は、 結果の単一のセットが重複してもよいので、数は、
IF(I = 0 && NUMS [ I-1] == NUMS [I]!)継続; // 重複を避けるために、

IF(NUMS [I] == *ターゲット4。){
IF (NUMSは[I + 3] == NUMS [I]){
res.add(は、Arrays.asList(NUMS [I]、NUMS [I]、NUMS [I]、NUMS [I]));
RESを返します。
}
}

もし(NUMS [I] + 3 *のNUMS [nums.length-1] <ターゲット)続けます。// NUMS [I]太小

IF(NUMS [I] * 4>ターゲット)戻りRES。// NUMS [I]太大

threeSumForFourSum(NUMS、ターゲットNUMS [i]は、I + 1、RES、NUMS [I])。
}
RESを返します。

}

公共ボイドthreeSumForFourSum(INT [] NUMS、INT対象、INT開始、リスト<リスト<整数>> RES、INT Z1){

[開始] 3 *のNUMS(IF> || 3 *のNUMSを標的[nums.length-1 <ターゲット)のリターン;

用(INT I =開始; iは<; I ++はnums.length-2){

IF(NUMS [i]が* 3>ターゲット)のリターン; //过大

IF(NUMS [I] + NUMS [nums.length-1] * 2 <ターゲット)続けます。//过小

(I = && NUMSを起動し、[I-1] == NUMS [i]が!)続行。


IF(NUMS [I + 2] == NUMS [I]){
res.add(は、Arrays.asList(Z1、NUMS [i]は、NUMS [i]は、NUMS [I]))。
返します。
}
}
twoSumForFourSum(NUMS、ターゲットNUMS [i]は、I + 1、RES、Z1、NUMS [I])。
}

}

公共ボイドtwoSumForFourSum(INT [] NUMS、INT対象、INT開始、リスト<リスト<整数>> RES、INT Z1、Z2 INT){

リターン(== nums.length-1を起動する)場合。

IF(NUMS [開始] * 2>ターゲット)のリターン;

HashMapの<整数、整数>マップ=新しいHashMapの<>();
用(INT I =開始; iはnums.lengthを<; iは++){
(!私は= && NUMSを起動[I-1] == NUMS [i])と続行。//避免重复
(I!= nums.length-1 && 2 * NUMS [I] ==ターゲット)であれば{
IF(NUMS [I + 1] == NUMS [I]){
res.add(は、Arrays.asList(Z1、Z2、NUMS [i]は、NUMS [I]))。
}
}
int型のカット=目標NUMS [I]。
IF(map.containsKey(カット)){
res.add(は、Arrays.asList(Z1、Z2、カット、NUMS [I]))。
持続する;
}
map.put(NUMS [i]は、I)。
}
}

 

おすすめ

転載: www.cnblogs.com/yingying7/p/11044215.html