アレイは3等分されています。質問の意味があなたの整数Aの配列を与えることです、あなたはそうでない場合はfalseに分け、唯一の真の唯一の3つの非ヌルと同等の一部を返すことができます。例、
例1:
入力:A = [0,2,1、-6,6-、-7,9,1,2,0,1] 出力:真の 説明:0 + 2 + 1 = -6 + 6から7 + 9 + 1 = 2 + 0 + 1例2:
入力:A = [0,2,1、-6,6,7,9、-1,2,0,1] 出力:偽例3:
入力:A = [3,3,6,5、-2,2,5,1、-9,4] 出力:真の 説明:3 + 3 = 6 = 5から2 + 2 + 5 + 1 - 9 + 4
アイデアは、ダブルポインタで行うことです。第1の判定コーナーケースは、全体のアレイと3で割り切れないすべての添加元素の合計が、それは偽でなければならない場合。その後、二重leftSumが残っているかどうか確認するために、両側から接近ポインタ、右はrightSum 1/3合計されている可能性が。注(<右を左の)書き込みは、例えば、以下のケースを説明する場合には、(+ 1 <右を左)、ループ終了条件ながらダブルポインタという。
入力[1、-1,1、-1]出力真予想偽
時間O(N)
スペースO(N) - 二つの配列を格納するために使用されるとrightSum leftSum
Java実装
1 クラスソリューション{ 2 公共 ブール canThreePartsEqualSum(INT [] A){ 3。 INT SUM = 0 ; 4。 ため(INT I:A){ 5 SUM + = I; 6。 } 7。 // コーナーケース 8。 IF(SUM 3%。! = 0 ){ 9 // 和直接バックfalseに3の倍数ではない 10 リターン falseに; 11 } 12である 13れる // 時間節約、2見つけるためにアレイから始まる、二重ポインタ 14 のintを0 =左; 15 INT leftSum = A [左]; 16 INT右A.length = - 1 ; 17。 INT rightSum = A [右]; 18である 19。 // 使用のみアレイを防止する、<1 +右の理由を残し二つの部分に分かれ 20 // 例:[1、-1,1、-1]決意として、左<右の条件を使用して、エラーが発生し 21である 一方で(1 +は<左が右){ 22は、 IF / ==(SUM leftSum 3。 。SUM rightSum == && / 3 ){ 23であり 、// 左右合計/ 3に等しいだけでなく、中間に等しくなければならない 24 リターン 真へ; 25 } 26は、 IF(!。leftSum = SUMは/ 3 ){ 27 // 0が初期値を与える=左、最初++左べきで、A = + leftSumでは、[左]; 28 leftSum + = A [++ 左]; 29 } 30 IF(rightSum != SUM / 3 ){ 31である // 。; =右A.length - - 1は、初期値を与え、第1の右べきである、[右] + rightSumで= 32 [ - rightSum = A + 右]; 33です } 34は } 35 リターン falseに; 36 } 37 }
JavaScript実装
1 / * * 2 * @param {数[]} 3 * @return {ブール} 4 * / 5 VAR canThreePartsEqualSum = 関数(A){ 6 LET和= 0 。 7 のための(AのNUM){ 8 和+ = NUM。 9 } 10 11 // コーナーケース 12 であれば(和%3 == 0] ){ 13 リターン 偽。 14 } 15 16 // 通常の場合 17 LET = 0を残し、 18である LET leftSum = ; A [左] 19。 せ右A.length = - 1 ; 20である LET rightSum = [右] A 21は 、一方(。+ 1左< 右){ 22は IF(SUM leftSum === / 3 && === SUM rightSum / 3 ){ 23れる // 左右和/ 3に等しいだけでなく、中間に等しくなければならない 24 リターン 真へ; 25 } 26である IF(SUM leftSum == / 3!){ 27 // 左= 0が得られます初期値は、最初++左べきで、Aは= + leftSum [左]で、 28 leftSum + = A [++ 左]; 29 } 30 IF(RightSum SUM == / 3!){ 31は // 右A.length = - 1が初期値を与え、第1の右必要があります- 、A = + rightSum [右]に; 32 rightSum = A + [ - - 右]; 33である } 34である } 35 リターン falseに; 36 }。